【问题标题】:Passing Python List to WCF Service将 Python 列表传递给 WCF 服务
【发布时间】:2011-07-26 17:07:18
【问题描述】:

我正在尝试将字符串列表(或数组、集合)从 python 传递到 WCF 服务端点

WCF 界面:

[OperationContract]
string[] TestList(IEnumerable<string> vals);

Web.config 中的绑定:

<endpoint address="http://localhost:13952/Service/Endpoint.svc" binding="basicHttpBinding" contract="Service.IEndpoint">

调用服务的 Python 代码:

from suds.client import Client
url = 'http://localhost:13952/Service/Endpoint.svc?wsdl'
client = Client(url)

result = client.service.TestList(('a', 'b', 'c'))

产生的错误:

suds.WebFault: Server raised fault: 'The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:vals. The InnerException message was 'Error in line 1 position 310. Expecting state 'Element'.. Encountered 'Text'  with name '', namespace ''. '.  Please see InnerException for more details.'

我将尝试使用 WireShark 捕获数据包并尝试从那里进行调试。希望有人知道一个简单的解决方案。

谢谢。

【问题讨论】:

  • 我不熟悉 suds 或 python,但从错误消息看来,您已将命名空间信息作为肥皂消息的一部分发送,tempuri 是自 asmx 以来的默认命名空间服务微软堆栈上的日子
  • 我也不熟悉python,但是消息“期望状态'元素'..遇到'文本'”意味着字符串数组没有以WCF期望的格式序列化。查看类似问题herehere

标签: python wcf serialization wcf-binding


【解决方案1】:

您需要使用 Suds 客户端工厂。 所以你缺少的重要部分是client.factory.create('ArrayOfString')

见下面的单元测试:

#!/usr/bin/env python
import unittest
import suds
from suds.client import Client

class TestCSharpWebService(unittest.TestCase):

    def setUp(self):
        url = "http://localhost:8080/WebService.asmx?wsdl=0"
        self.client = Client(url)

    def test_service_definition(self):
        # You can print client to see service definition.
        self.assertTrue("orderAlphabetically" in self.client.__str__())
        self.assertTrue("ArrayOfString" in self.client.__str__())

    def test_orderAlphabetically_service(self):
        # Instanciate your type using the factory and use it.
        ArrayOfString = self.client.factory.create('ArrayOfString')
        ArrayOfString.string = ['foo', 'bar', 'foobar', 'a', 'b', 'z']
        result = self.client.service.orderAlphabetically(ArrayOfString)
        # The result list contains suds.sax.text.Text which acts like a string.
        self.assertEqual(
            type(result.string[0]),
            suds.sax.text.Text)
        self.assertEqual(
            [str(x) for x in result.string],
            ['a', 'b', 'bar', 'foo', 'foobar', 'z'])

if __name__ == '__main__':
    unittest.main()

我在 MonoDevelop 3 和 Mono 2.10 中运行 Web 服务。

namespace WebServiceMono
{
    using System.Linq;
    using System.Web.Services;
    using System.Collections.Generic;

    public class WebService : System.Web.Services.WebService
    {
        [WebMethod]
        public string[] orderAlphabetically (List<string> list)
        {
            var result = list.OrderBy (s => s);
            return result.ToArray ();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多