问题:
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序列化问题。