0

Web メソッドを使用して情報を取得しようとすると問題が発生します。プロキシを使用して Web サービスを呼び出しています。そのプロキシには、「out」パラメータを使用してデータを返す操作があります。

サーバーは操作を正常に実行し、適切にインスタンス化されたパラメーターを返します (トラフィック アナライザーを使用して SOAP リターン メッセージも確認しましたが、問題ありません) が、これらのパラメーターをプロキシに要求すると、null 値しか取得できません。

ここにいくつかのコード情報があります:

//これは、プロキシを使用した Web サービスの呼び出しです (t はプロキシで、get_capabilities は webmethod です)。

public trf_capabilities get_capabilities() {
            trf_capabilities trfcap = new trf_capabilities();                
            trfcap.protocol_list= t.get_capabilities(0, out trfcap.pause, out trfcap.maxfiles, out trfcap.maxsize, out trfcap.encrypt, out trfcap.authenticate, out trfcap.integritycheck, out  trfcap.hashtype, out  trfcap.multipath, out  trfcap.profile_list);            
            return trfcap;
        }

// これは webMethod の定義です

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("iTransfer-get_capabilities",/*RequestElementName="elementoVacio_",*/ RequestNamespace="", ResponseElementName="trf_capabilitiesPar", ResponseNamespace="", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("protocol_list", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public protocolType[] get_capabilities([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int vacio, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool pause, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out uint maxfiles, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out uint maxsize, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool encrypt, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool authenticate, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool integritycheck, [System.Xml.Serialization.XmlElementAttribute("hash_type", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out hash_typeType[] hash_type, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool multipath, [System.Xml.Serialization.XmlElementAttribute("profile_list", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out profile_listType[] profile_list) {
            object[] results = this.Invoke("get_capabilities", new object[] {
                        vacio});
            pause = ((bool)(results[1]));
            maxfiles = ((uint)(results[2]));
            maxsize = ((uint)(results[3]));
            encrypt = ((bool)(results[4]));
            authenticate = ((bool)(results[5]));
            integritycheck = ((bool)(results[6]));
            hash_type = ((hash_typeType[])(results[7]));
            multipath = ((bool)(results[8]));
            profile_list = ((profile_listType[])(results[9]));
            return ((protocolType[])(results[0]));
        }

ご覧のとおり、call メソッドと handler メソッドの両方で「out」トークンを使用していますが、正しい動作を得るには十分ではないようです。

最後に、トラフィック アナライザーで傍受された SOAP メッセージを次に示します。

Content-Type: text/xml; charset=UTF-8
Server: SOAPStandaloneServer
Content-Length: 584
Connection: close

<E:Envelope xmlns:E="http://schemas.xmlsoap.org/soap/envelope/" xmlns:A="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.w3.org/2001/XMLSchema"><E:Body><ns1:get_capabilitiesResponse xmlns:ns1=""><ns1:pause>true</ns1:pause><ns1:maxfiles>5</ns1:maxfiles><ns1:maxsize>0</ns1:maxsize><ns1:encrypt>true</ns1:encrypt><ns1:authenticate>true</ns1:authenticate><ns1:integritycheck>true</ns1:integritycheck><ns1:multipath>true</ns1:multipath></ns1:get_capabilitiesResponse></E:Body></E:Envelope>

何か案は?

4

2 に答える 2

1

[装飾]と回答の連載は正しい方向に進んでいると思います。そこにある配列は少しトリッキーに見えますが、それらの要素のシリアル化ルーチンはありますか?

繰り返しになりますが、これだけの量の出力パラメーターを持つことは、ちょっと圧倒されるように思えます。おそらく「ServiceResponse」構造体を作成し、すべてのパラメーターをプロパティとして追加したでしょう。

編集: 次のステップでは、応答は問題ないように見えますが、プロキシで逆シリアル化に問題がある場合は、(もちろん) プロキシをさらに深く掘り下げることをお勧めします。プロキシは生成されていますか、それとも手動で作成していますか? それをステップ実行して、与えられたパラメーターで何をしようとしているのかを確認してください。多くの場合、私は目が血を流すまで Web サービスをハックしますが、デシリアライゼーションの仕様が時代遅れであることを発見するだけです。

于 2010-07-05T12:00:00.143 に答える
0

このすべてについて興味深いものを見つけました。私が持っている 2 種類の Web メソッドのヘッダーをチェックしてきました (C++ で書かれたものと、C# で開発したテスト用のもの)。out パラメータについては、.NET がある種のラッピングを追加することに気付きました。msdn の説明は次のとおりです。

SOAP 応答の XML 部分は、要素内の結果を含め、Web サービス メソッドの出力パラメーターをカプセル化します。カプセル化要素の名前は、既定では、Response が追加された Web サービス メソッドの名前です。

ここにリンクがあります

「出力」参照パラメーターを機能させるには、そのラッパーを使用する必要があるようです。

于 2010-07-05T14:10:26.240 に答える