将 Python 列表传递给 WCF 服务 [英] Passing Python List to WCF Service
本文介绍了将 Python 列表传递给 WCF 服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试将字符串列表(或数组、集合)从 python 传递到 WCF 服务端点
I am trying to pass a list (or array, collection) of strings from python to a WCF service endpoint
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 捕获数据包并尝试从那里进行调试.希望有人知道一个简单的解决方案.
I will try to catch the packets using WireShark and try to debug from there. Hoping someone knows a simple solution for this.
谢谢.
推荐答案
您需要使用 Suds 客户端工厂.所以你缺少的重要部分是 client.factory.create('ArrayOfString')
.
You need to use Suds client factory.
So the important piece you're missing is client.factory.create('ArrayOfString')
.
请参阅下面的单元测试:
See unit test below:
#!/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 服务.
I ran the web service in MonoDevelop 3 and Mono 2.10.
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 ();
}
}
}
这篇关于将 Python 列表传递给 WCF 服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文