21

非 WCF クライアントとの相互運用を必要とする WCF Web サービスを構築しています (実際、WCF クライアントはありません)。

SOAP 1.2 を使用して WSDL を既に作成しました (この例のように)。私は WSDL を検証し、このファイル (表面的には異なる WCF によって生成された WSDL ではありません) を使用して、soapUIテスト プロジェクトを作成しました。

Web サービスが SOAP 1.2 をサポートする必要があるため、SOAP 1.1 (初期のプロトタイプでは問題なく動作していました) にフォールバックすることはできません。

WSCF.blueを使用して、WCF サービス、インターフェイス、およびデータ コントラクト クラスを生成しました。ブラウザーで WCF サービスにアクセスすると、すべてがうまくコンパイルされ、エンドポイントが公開されます。すべてがうまくいっているようです。

soapUi からメソッドを呼び出そうとすると、サーバーから次の応答が返されます (soapUI から見えるように)。

HTTP/1.1 415 Cannot process the message because the content type 
'application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing"' 
was not the expected type 'text/xml; charset=utf-8'.
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Mon, 30 Apr 2012 08:15:29 GMT
Content-Length: 0

(実際のメソッド名と名前空間は、この質問のために手動で変更されています。名前空間のタイプミスはコードのエラーではありません-この質問を入力する際の見落としです)

SOAP 1.1 では、コンテンツ タイプがtext/xmlでなければならないと指定されていることは知っています。SOAP 1.2 にはapplication/soap+xmlが必要です。

私の生のリクエスト(soapUIによる):

POST http://localhost/MyWs.svc HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing"

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
               xmlns:ns="http://tempuri.org">
   <soap:Header/>
   <soap:Body>
      <ns:fetchMyThingRequest attribute1="1" attribute2="10">
      </ns:fetchMyThingRequest>
   </soap:Body>
</soap:Envelope>

この応答から、要求が適切に形成されていることがわかります。これは正しいコンテンツ タイプの SOAP 1.2 要求です。ただし、私の WCF サービスは、このコンテンツ タイプを想定していません。これは、正しく構成されておらず、SOAP 1.1 Web サービスであるとまだ認識していることを意味すると思います。

このブログ投稿によると、最小限の Web.config :

<system.serviceModel>
  <services>
    <service name="MyNamespace.MyPort">
      <endpoint address="" binding="customBinding" bindingConfiguration="httpSoap12" contract="IWsPort12" />
    </service>
  </services>

  <bindings>
    <customBinding>
      <binding name="httpSoap12">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport />
      </binding>
    </customBinding>
  </bindings>
</system.serviceModel>

サービス契約のスニペット:

[ServiceContract(Namespace = "http://tempuri.org")]
public interface IWsPort
{
  [OperationContract(Action = "http://tempuri.org/FetchMyThing")]
  [FaultContract(typeof(WsFault), Action = "http://tempuri.org/FetchMyThing", Name = "fetchMyThingFault")]
  [XmlSerializerFormat(SupportFaults = true)]
  FetchMyThingResponse FetchMyThing(FetchMyThingRequest request);
}

WCF サービスのサービス トレースを有効にすると、仮説を裏付けるような次の例外が表示されます。

Activity: Listen at 'http://mycomputer/MyWs.svc
<Exception>
  <ExceptionType>System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
  <Message>Content Type application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" was sent to a service expecting text/xml; charset=utf-8.  The client and service bindings may be mismatched.   
  </Message>
(erroneous detail snipped)
</Exception>

したがって、このメッセージを信じるなら、私のコントラクトとサービス バインディングはおそらく一致しませんが、WCF について理解していることから、私の構成 (または少なくともその背後にある意図) は正しいです。

私の構成の何が問題なのか、誰か考えはありますか?

4

3 に答える 3

9

私が考えることができる唯一のことは、バインディングを詳細に指定しておらず、HTTP を使用しているため (「http://mycomputer/MyWs.svcでリッスン」)、これにデフォルト(つまりbasicHttpBinding)を使用しているため、不一致が発生していますか?

于 2012-05-02T06:55:54.260 に答える
0

このリンクを確認してください。 方法: ASP.NET Web サービス クライアントと相互運用するように WCF サービスを構成します

Windows Communication Foundation (WCF) サービス エンドポイントを ASP.NET Web サービス クライアントと相互運用できるように構成するには、System.ServiceModel を使用します。サービス エンドポイントのバインディング タイプとしてのBasicHttpBindingタイプ。

また、2 つのエンドポイントを定義すると、同じサービスの HTTP バージョンと HTTPS バージョンを使用できます。

于 2015-09-07T21:41:32.953 に答える