我们一直在与SOAP相关的问题进行斗争。我们有一个基于SOAP的API,可以从许多语言(PHP,Ruby等)中调用。然而,在某些情况下,C#似乎会窒息。
不幸的是,我们不清楚它为何会死亡。我们不是C#人员,但我们确实找到了一个外部的C#人来查看问题。而且,他们也感到困惑!
可以在这里看到wdsl:http://sandbox.knowledgetree.com/ktwebservice/webservice.php?wsdl(是的,它很大)。
从C#开始,会话创建和其他几个调用工作愉快。但是,get_folder_contents调用失败。调用执行,fiddler显示返回的有效XML。但是,C#的返回值为null。
每个Fiddler的请求如下:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<s:get_folder_contents>
<session_id xsi:type="xsd:string">or8llmjj5rm7co9h5p2k762s77</session_id>
<folder_id xsi:type="xsd:int">99</folder_id>
<depth xsi:type="xsd:int">1</depth>
<what xsi:type="xsd:string">DFS</what>
</s:get_folder_contents>
</s:Body>
</s:Envelope>
(我在fiddler日志中添加了空格和换行符。)
每个Fiddler的回复(但是,再次为clairty格式化)如下:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns4="urn:KnowledgeTree" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:get_folder_contentsResponse>
<item xsi:type="ns4:kt_folder_contents">
<status_code xsi:type="xsd:int">0</status_code>
<message xsi:type="xsd:string"></message>
<folder_id xsi:type="xsd:int">99</folder_id>
<folder_name xsi:type="xsd:string">Nic</folder_name>
<full_path xsi:type="xsd:string">Nic</full_path>
<items xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="ns4:kt_folder_item[0]" xsi:nil="true"/>
</item>
</SOAP-ENV:get_folder_contentsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我们用来测试的(粗)C#应用程序如下:
public partial class Form1 : Form
{
private string _sessionId;
private KnowledgeTreePortClient _webService;
public Form1()
{
InitializeComponent();
_webService = new KnowledgeTreePortClient();
_webService.loginCompleted += new EventHandler<loginCompletedEventArgs>(WebLoginCompleted);
_webService.loginAsync("username", "secret_password", "nil", "c-sharp-test");
}
private void WebLoginCompleted(object sender, loginCompletedEventArgs e)
{
_sessionId = e.Result.message;
_webService.get_folder_contentsCompleted += GetFolderComplete;
_webService.get_folder_contentsAsync(_sessionId, 99,1, "DFS");
}
private void GetFolderComplete(object sender, get_folder_contentsCompletedEventArgs e)
{
}
}
我更愿意从客户端(C#)修复此问题。但是,我们非常感谢任何关于我们做错事的指导!
RENEN。
答案 0 :(得分:2)
我尝试过并得到了同样的回应。
我解决它并获得您正在寻找的响应的方式是添加Web引用。要执行此操作,请右键单击项目的references文件夹,选择添加服务服务引用,单击底部的Web引用按钮,然后从那里继续。
该方法生成的代理类的行为与您期望的一样。
至于服务参考不起作用的原因我仍然在研究......
修改强>
所以我检查了对WSDL的响应Xml,我发现任何名称空间不匹配。我发现了一些文章详细说明了如何解决子元素(如数组)为null,这主要是因为命名空间不匹配 - 但在你的情况下,整个kt_folder_contents
值是bull,并且我可以看到名称空间生成的包装器中的(urn:KnowledgeTree
)是正确的。
我希望其他人可以为此解决问题 - 否则,如果Web参考生成的代理适合您...
答案 1 :(得分:0)
不确定这是否会因为有关真正根本原因的注释而有所不同,但我发现当SOAP响应中包含xsi:nil =时,C#/ VS会将整个返回值解释为null “真”/&GT;价值如:
项目xsi:type =“SOAP-ENC:Array”SOAP-ENC:arrayType =“ns4:kt_folder_item [0]”xsi:nil =“true”/&gt;
我试图在WINFORMS应用程序中使用web服务,没有这个数组值的响应似乎工作正常但是在响应对象中显示空返回值的两者都有nil =“true”表示作为对象一部分的数组。不知道这只是巧合,但似乎与评论(WS-I BP1)合规性有关?
艾伦
答案 2 :(得分:0)