2

ベンダーによると、SOAP リクエストが正しくない理由と、それを変更する方法を数日間調査してきました。

以下の手順に従って、SOAP クライアントを作成しました。

  • プロジェクトにサービス参照を追加しました。サービスの wsdl は次のとおりです。


    <?xml version="1.0" encoding="utf-8"?>
    <wsdl:definitions name="vz801802Service" targetNamespace="http://schemas.vecozo.nl/VZ801802/v1" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://schemas.vecozo.nl/VZ801802/v1" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
     <wsp:Policy wsu:Id="vz801802Soap12_policy">
      <wsp:ExactlyOne>
       <wsp:All>
        <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
         <wsp:Policy>
          <sp:TransportToken>
           <wsp:Policy>
            <sp:HttpsToken RequireClientCertificate="true"/>
           </wsp:Policy>
          </sp:TransportToken>
          <sp:AlgorithmSuite>
           <wsp:Policy>
            <sp:Basic256/>
           </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
           <wsp:Policy>
            <sp:Strict/>
           </wsp:Policy>
          </sp:Layout>
         </wsp:Policy>
        </sp:TransportBinding>
       </wsp:All>
      </wsp:ExactlyOne>
     </wsp:Policy>
     <wsp:Policy wsu:Id="vz801802Soap11_policy">
      <wsp:ExactlyOne>
       <wsp:All>
        <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
         <wsp:Policy>
          <sp:TransportToken>
           <wsp:Policy>
            <sp:HttpsToken RequireClientCertificate="true"/>
           </wsp:Policy>
          </sp:TransportToken>
          <sp:AlgorithmSuite>
           <wsp:Policy>
            <sp:Basic256/>
           </wsp:Policy>
          </sp:AlgorithmSuite>
          <sp:Layout>
           <wsp:Policy>
            <sp:Strict/>
           </wsp:Policy>
          </sp:Layout>
         </wsp:Policy>
        </sp:TransportBinding>
       </wsp:All>
      </wsp:ExactlyOne>
     </wsp:Policy>
     <wsdl:types>
      <xsd:schema targetNamespace="http://schemas.vecozo.nl/VZ801802/v1/Imports">
       <xsd:import schemaLocation="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc?xsd=xsd0" namespace="http://schemas.vecozo.nl/VZ801802/v1"/>
       <xsd:import schemaLocation="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
       <xsd:import schemaLocation="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc?xsd=xsd2" namespace="http://schemas.vecozo.nl/VZ801802/v1/messages"/>
       <xsd:import schemaLocation="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc?xsd=xsd3" namespace="http://schemas.vecozo.nl/VZ801802/v1/types"/>
      </xsd:schema>
     </wsdl:types>
     <wsdl:message name="vz801802Service_Controleer_InputMessage">
      <wsdl:part name="parameters" element="tns:Controleer"/>
     </wsdl:message>
     <wsdl:message name="vz801802Service_Controleer_OutputMessage">
      <wsdl:part name="parameters" element="tns:ControleerResponse"/>
     </wsdl:message>
     <wsdl:portType name="vz801802Service">
      <wsdl:operation name="Controleer">
       <wsdl:input wsaw:Action="http://schemas.vecozo.nl/VZ801802/v1/Controleer" message="tns:vz801802Service_Controleer_InputMessage"/>
       <wsdl:output wsaw:Action="http://schemas.vecozo.nl/VZ801802/v1/Controleer/reply" message="tns:vz801802Service_Controleer_OutputMessage"/>
      </wsdl:operation>
     </wsdl:portType>
     <wsdl:binding name="vz801802Soap12" type="tns:vz801802Service">
      <wsp:PolicyReference URI="#vz801802Soap12_policy"/>
      <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="Controleer">
       <soap12:operation soapAction="http://schemas.vecozo.nl/VZ801802/v1/Controleer" style="document"/>
       <wsdl:input>
        <soap12:body use="literal"/>
       </wsdl:input>
       <wsdl:output>
        <soap12:body use="literal"/>
       </wsdl:output>
      </wsdl:operation>
     </wsdl:binding>
     <wsdl:binding name="vz801802Soap11" type="tns:vz801802Service">
      <wsp:PolicyReference URI="#vz801802Soap11_policy"/>
      <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="Controleer">
       <soap:operation soapAction="http://schemas.vecozo.nl/VZ801802/v1/Controleer" style="document"/>
       <wsdl:input>
        <soap:body use="literal"/>
       </wsdl:input>
       <wsdl:output>
        <soap:body use="literal"/>
       </wsdl:output>
      </wsdl:operation>
     </wsdl:binding>
     <wsdl:service name="vz801802Service">
      <wsdl:port name="vz801802Soap12" binding="tns:vz801802Soap12">
       <soap12:address location="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc"/>
      </wsdl:port>
      <wsdl:port name="vz801802Soap11" binding="tns:vz801802Soap11">
       <soap:address location="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc/soap11"/>
      </wsdl:port>
     </wsdl:service>
    </wsdl:definitions>

これにより、プロキシクラスが作成されました。

  • 次に、app.config を少し調整して、soap1.2 を強制的に使用するようにしました (問題があったため、soap1.1 エントリを削除しました)。

    <?xml version="1.0"?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <customBinding>
                    <binding name="vz801802Soap12">
                        <textMessageEncoding messageVersion="Soap12" />
                        <httpsTransport requireClientCertificate="true" />
                    </binding>
                </customBinding>
            </bindings>
            <client>
                <endpoint address="https://acccovwebservice.vecozo.nl/v1/VZ801802.svc"
                    binding="customBinding" bindingConfiguration="vz801802Soap12"
                    contract="COV_VZ801802.vz801802Service" name="vz801802Soap12" />
            </client>
        </system.serviceModel>
    </configuration>
    

  • Web サービスをインスタンス化して呼び出すコードは次のとおりです。

    WSHttpBinding serviceBinding = new WSHttpBinding(SecurityMode.Transport);
    serviceBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
    serviceBinding.ReceiveTimeout = new TimeSpan(0, 0, 120);
    EndpointAddress endpointAddress = new EndpointAddress(Bericht.Url); COV_VZ801802.vz801802ServiceClient VZ801_Client = new COV_VZ801802.vz801802ServiceClient(serviceBinding, endpointAddress);
    if (Bericht.Certificaat != null && Bericht.Certificaat != "") { X509Certificate2 x509_2 = new X509Certificate2(Bericht.Certificaat); VZ801_Client.ClientCredentials.ClientCertificate.Certificate = x509_2; }
    COV_VZ801802.ControleerRequestType VZ801_Request = new COV_VZ801802.ControleerRequestType();
    // Here I fill request with data
    COV_VZ801802.ControleerResponseType VZ801_Reponse = VZ801_Client.Controleer(VZ801_Request);

  • Fiddler でメッセージを確認すると、次のように表示されます。

    POST https://acccovwebservice.vecozo.nl/v1/VZ801802.svc HTTP/1.1
    Content-Type: application/soap+xml; charset=utf-8
    Host: acccovwebservice.vecozo.nl
    Content-Length: 1216
    Expect: 100-continue
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive

    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> <s:Header> <a:Action s:mustUnderstand="1">http://schemas.vecozo.nl/VZ801802/v1/Controleer</a:Action> <a:MessageID>urn:uuid:a492c393-a93b-43df-9f0e-4e3f7116f8a2</a:MessageID> <a:ReplyTo> <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> </a:ReplyTo> <a:To s:mustUnderstand="1">https://acccovwebservice.vecozo.nl/v1/VZ801802.svc</a:To> </s:Header> <s:Body> <Controleer xmlns="http://schemas.vecozo.nl/VZ801802/v1"> <request xmlns:b="http://schemas.vecozo.nl/VZ801802/v1/messages" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <b:Zorgaanbieder i:nil="true" xmlns:c="http://schemas.vecozo.nl/VZ801802/v1/types"/> <b:Zoekopdrachten xmlns:c="http://schemas.vecozo.nl/VZ801802/v1/types"> <c:Zoekopdracht> <c:Volgnummer>0</c:Volgnummer> <c:Geboortedatum>1956-01-14</c:Geboortedatum> <c:Peildatum>2013-05-08</c:Peildatum> <c:Bsn i:nil="true"/> <c:Verzekerdenummer>FB_60585</c:Verzekerdenummer> <c:Postcode i:nil="true"/> <c:ReferentieZorgaanbieder i:nil="true"/> <c:Huisnummer i:nil="true"/> <c:Huisnummertoevoeging i:nil="true"/> </c:Zoekopdracht> </b:Zoekopdrachten> </request> </Controleer> </s:Body> </s:Envelope>

プログラムを実行すると、次のような例外が発生します。

アクション '' のメッセージは、EndpointDispatcher での ContractFilter の不一致により、受信側で処理できません。これは、コントラクトの不一致 (送信者と受信者の間のアクションの不一致) または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインド (メッセージ、トランスポート、なしなどのセキュリティ要件を含む) を持っていることを確認します。

ベンダーは、このメッセージには 2 つの問題があると私に言いました。

  1. ヘッダーの content-type にアクションが定義されていません。コンテンツタイプはapplication/soap+xml;charset=UTF-8;action="http://schemas.vecozo.nl/VZ801802/v1/Controleer"
  2. MustUnderstand の両方の値 (Action および To タグ内) は、1 ではなく 0 にする必要があります。

私はあらゆる種類の場所を検索して検索し、カスタムヘッダーなどを試しましたが、これらの問題を修正する方法はまだ見つかりませんでした.

誰でもこれで私を助けることができますか?6 月 1 日までにこれを修正する必要があるため、私は非常に必死です。

ところで私は.NET 4.0を使用しています BTW2 私は自分のプロジェクトを編集するためにWindowsデスクトップ用のVisual Studio Express 2012を使用しています

編集:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
    [System.ServiceModel.ServiceContractAttribute(Namespace="schemas.vecozo.nl/VZ801802/v1";, ConfigurationName="COV_VZ801802.vz801802Service")] 
    public interface vz801802Service 
    { 
        [System.ServiceModel.OperationContractAttribute(Action="schemas.vecozo.nl/VZ801802/v1/Controleer";, ReplyAction="schemas.vecozo.nl/VZ801802/v1/Controleer/reply")] 
        SOAPLib.COV_VZ801802.ControleerResponseType Controleer(SOAPLib.COV_VZ801802.ControleerRequestType request); 
    }
4

1 に答える 1

2

あなたの問題は次のものに関係していると思います:

次に、app.config を少し調整して、soap1.2 を強制的に使用するようにしました。

コードでクライアントを作成するときに既に WSHttpBinding を指定しており、これによりデフォルトで soap12 リクエストが送信されます。

バインディングの微調整 (カスタム バインディングの追加) は、soap アクションを content-type ヘッダー値に入れるという wsHttpBinding の既定の動作をオーバーライドしていると思います。

生成された構成ファイルを微調整せずに使用するとどうなりますか?

編集

私の新しい理論はこれです-コードでクライアントを作成する方法により、WCFは構成ファイルで定義されたバインディングを無視します。

構成ファイルで定義されているクライアント バインディングの名前を渡して、バインディング インスタンスを作成する必要があります。

var serviceBinding = new WSHttpBinding("vz801802Soap12");

それか、コードでBinding.MessageVersion プロパティも設定します。

編集

私が理解できないのは、バインディングを渡してコードでクライアントを初期化する理由です。クライアントを作成し、構成ファイルでクライアント エンドポイントの名前を渡すだけでよいでしょうか? サービス参照を追加したときに必要なものはすべてビジュアルスタジオによって構成に入れられているはずなので、コードで何かを作成し始める理由はないはずです

于 2013-05-08T14:29:45.127 に答える