0

[サービス参照の追加] を介して追加されたサービスを機能させるのに苦労しています。問題なくサービスを呼び出すことができ、応答が返されます (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">
  <SOAP-ENV:Body>
    <executeResponse>
      <request_number>REQ0048172</request_number>
    </executeResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

ただし、そこには nullexecuteResponseがあります。Reference.cs の関連部分を以下に示します。

インターフェース:

[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.serviceprovider.com/service")]
public interface Soap {

    // CODEGEN: Generating message contract since the operation execute is neither RPC nor document wrapped.
    [System.ServiceModel.OperationContractAttribute(Action="http://www.serviceprovider.com/service/execute", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    executeResponse1 execute(executeRequest request);

}

クライアント:

public partial class SoapClient : System.ServiceModel.ClientBase<Soap>, Soap {

    executeResponse1 Soap.execute(executeRequest request) {
        return base.Channel.execute(request);
    }

    public executeResponse execute(execute execute1) {
        executeRequest inValue = new executeRequest();
        inValue.execute = execute1;
        executeResponse1 retVal = ((Soap)(this)).execute(inValue);
        return retVal.executeResponse;
    }

}

executeResponse1:

[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
public partial class executeResponse1 {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.serviceprovider.com/service", Order=0)]
    public executeResponse executeResponse;

}

実行応答:

[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.serviceprovider.com/service")]
public partial class executeResponse : object, System.ComponentModel.INotifyPropertyChanged {

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
    public string request_number { get; set; }

}

SOAP 応答からこの問題の修正に戻る方法がわかりません。任意の提案をいただければ幸いです。

4

1 に答える 1

1

これによれば:

Namespace="http://www.serviceprovider.com/service"

WCF は、本文の下の SOAP 要素が上記の名前空間を持つことを想定しています。ただし、それらは null です。結果の SOAP を変更できる場合は (テストのために一時的にモックしても構いません)、 body 要素を次のように置き換えてみてください。

<SOAP-ENV:Body xmlns="http://www.serviceprovider.com/service">

それ以外の場合は、プロキシ コードで Namespace="" を設定してみてください (WCF で許可されるかどうかはわかりません)。WSDL 内のこの名前空間を空の文字列に置き換えることもできます。これは、プロキシの生成に関してもう少し堅牢になる可能性があります。

最後に、これで問題が解決しない場合は、この WSDL (またはプロキシにあるデータ コントラクトを直接) に基づいて WCF サービスをセットアップし、返される SOAP が実際のサービスが返す SOAP とどのように異なるかを確認します。

于 2013-08-30T20:03:33.433 に答える