天天看点

Python通过suds调用WCF服务 传递Python List 到 WCF Service

问题:

python传递list (or array, collection) of strings 到一个WCF service endpoint

The WCF interface:

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

Binding in Web.config:

Python调用WCF服务:

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

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

错误:

使用WireShark抓包,观察序列化后的soap数据,发现list序列化有错误,导致服务端无法反序列化。

解决方案:

使用Suds client factory

。此步骤非常重要:

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[]),
            suds.sax.text.Text)
        self.assertEqual(
            [str(x) for x in result.string],
            ['a', 'b', 'bar', 'foo', 'foobar', 'z'])

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

web service:

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 ();
        }
    }
}
           

使用

client.factory.create('ArrayOfString')

后可以很好的解决python list序列化问题。