2011-07-26 34 views
6

我想传递一个列表(或阵列,集合)的WCF服务端点从蟒蛇传递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代码调用SER副:

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来捕捉数据包并试图从那里来调试。希望有人知道这个简单的解决方案。

谢谢。

+1

我不熟悉suds或python,但是从错误消息看起来好像您已经发送命名空间信息作为您的soap消息的一部分,tempuri是自asmx天后的默认命名空间服务微软堆栈 – kd7

+0

我对python也不熟悉,但是“Expecting state'Element'..遇到'Text'”意味着字符串数组没有以WCF期望的格式序列化。看到类似的问题[这里](http://stackoverflow.com/questions/5219505/invoking-a-wcf-method-that-takes-a-list-of-objects-consumed-via-an-iphone-applic)和[这里](http://social.msdn.microsoft.com/Forums/en/wcf/thread/fae9dbc5-c83e-42b2-808e-1a393e621bb8)。 – Kimberly

回答

4

您需要使用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(); 
     } 
    } 
} 
+0

是的,就是这样 –