10

一段时间以来,我们一直在与 SOAP 相关的问题作斗争。我们有一个基于 SOAP 的 API,可以从多种语言(PHP、Ruby 等)调用。然而,C# 在某些情况下似乎会窒息。

不幸的是,我们不清楚它为什么会死。我们不是 C# 人员,但我们确实请了一个外部的 C# 人员来查看问题。而且,他们也是一脸懵逼!

wdsl 可以在这里看到:http ://sandbox.knowledgetree.com/ktwebservice/webservice.php?wsdl (是的,它很大)。

在 C# 中,会话创建和其他几个调用都可以正常工作。但是,get_folder_contents 调用失败。调用执行,提琴手显示返回的有效 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 的响应(但再次格式化为 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#)端解决这个问题。但是,任何关于我们做错了什么的指导将不胜感激!

仁。

4

3 回答 3

3

我试过了,得到了同样的反应。

我解决它并获得您正在寻找的响应的方法是添加一个网络参考。为此,请右键单击项目的引用文件夹,选择添加服务服务引用,单击底部的 Web 引用按钮,然后从那里继续。

该方法生成的代理类的行为与您预期的一样。

在此处输入图像描述

至于为什么服务参考不起作用,我仍在研究....

编辑:

因此,我检查了针对 WSDL 的响应 Xml,我无法发现任何名称空间不匹配。我发现了几篇文章,详细介绍了如何将子元素(如数组)解析为 null,这主要是因为命名空间不匹配 - 但在你的情况下,整个kt_folder_contents值是公牛的,据我所知,urn:KnowledgeTree生成的命名空间()包装是正确的。

我希望其他人可以解决此问题-否则,如果 Web Reference 生成的代理对您有用...

于 2012-12-20T16:40:54.687 回答
0

Not sure whether this makes a difference in view of the comments regarding true root cause but I have found that C#/VS interprets the entire return value as null when there is an array within the SOAP response that contains a xsi:nil="true"/> value as in:

items xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="ns4:kt_folder_item[0]" xsi:nil="true"/>

I am trying to consume the webservice in a WINFORMS application and responses without this array value seem to work fine but the two that show null return values in their response object both have the nil="true" for an array that is part of the object. Don't know if it's merely coincidence but appears to be related to comment on profile (WS-I BP1) compliance?

Alan

于 2012-12-27T13:39:30.573 回答
0

我遇到了这个问题,@QuintonBernhardt 建议的 Web Reference 代理解决方法对我有用。只想提一下如何在最近的 Visual Studio 版本(2017+)中添加 Web 引用:在常规添加服务引用对话框中,选择“高级”

add_service_reference

然后在兼容性部分选择“添加 Web 参考” 服务参考设置

于 2019-10-25T13:59:19.263 回答