10

しばらくの間、SOAP 関連の問題と戦ってきました。多数の言語 (PHP、Ruby など) から呼び出すことができる SOAP ベースの API があります。ただし、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 ごとに (ただし、明確にするためにフォーマットされています)、次のとおりです。

    <?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参照を追加することです。これを行うには、プロジェクトの参照フォルダーを右クリックし、[サービスサービス参照の追加]を選択し、下部にある[Web参照]ボタンをクリックして、そこから続行します。

そのメソッドによって生成されたプロキシクラスは、期待どおりに動作します。

ここに画像の説明を入力してください

サービス参照が機能しない理由については、まだ調査中です。

編集:

そのため、WSDLに対して応答Xmlを確認しましたが、名前空間の不一致を見つけることができません。サブ要素(配列など)がnullであるのを解決する方法を詳しく説明している記事がいくつか見つかりました。これは主に名前空間の不一致が原因でしたが、あなたの場合、値全体が強気であり、生成されkt_folder_contentsた名前空間()を見る限りですurn:KnowledgeTreeラッパーは正しいです。

他の誰かがこれを修正できることを願っています-そうでなければ、Webリファレンスで生成されたプロキシがあなたのために機能する場合...

于 2012-12-20T16:40:54.687 に答える
0

これが真の根本原因に関するコメントの観点から違いを生むかどうかはわかりませんが、SOAP 応答内に xsi:nil="true" を含む配列がある場合、C#/VS は戻り値全体を null として解釈することがわかりました。 /> 次のような値:

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

WINFORMS アプリケーションで Web サービスを使用しようとしていますが、この配列値のない応答は正常に動作しているように見えますが、応答オブジェクトで null の戻り値を示す 2 つのオブジェクトの一部である配列に対して、どちらも nil="true" を持っています。 . 単なる偶然かどうかはわかりませんが、プロファイル (WS-I BP1) 準拠に関するコメントに関連しているように見えますか?

アラン

于 2012-12-27T13:39:30.573 に答える