2011-07-10 4 views
6

HTTP GET要求を行うときにブラウザからヒットすることができるWCFホストSOAPサービスがあります。 HTTP POST要求の場合、応答は404 Not Foundです。.NET 4 WCF SOAPサービスHttp POSTが404を返します。見つからない

私のWeb.configファイルには次のようになります。私のサービスは以下のように.SVCファイルを使用してマークアップで定義されている

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior> 
       <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    <bindings> 
     <wsHttpBinding> 
      <binding> 
       <security mode="Transport"> 
        <transport clientCredentialType="Certificate" /> 
       </security> 
       <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 
     </wsHttpBinding> 
     <basicHttpBinding> 
      <binding> 
       <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

再び
<%@ ServiceHost Language="C#" Debug="true" Service="Boca.WebServices.Billing.QBService" CodeBehind="QBService.svc.cs" %> 

、私はブラウザを使用して、私のサービスを打つことができ、 HTTP GETではなくHTTP POSTを使用して以下のようにSOAPクライアントを呼び出します。

私は間違っていますか? .svcマークアップを使用せず、Web.configでサービスを定義するだけでいいですか?

UPDATE:

私はローカルホスト上のIIS Expressを使用してVS 2010の中から、私のWCFプロジェクト "デバッグ開始":サービスの仕事に8181ポート、HTTPポストを。サービスをIIS経由でホストする場合のみ、サービスへのHTTP POSTが拒否されているか見つからない。これはデフォルトであるHTTP

を使用しているときに一つだけのサービス契約を締結している場合は、エンドポイントを指定しない場合 - あなたはあなたのサービスがbasicHttpBindingを使用して1つ以上のエンドポイント上で待機します.NET 4を使用していると仮定すると、

答えて

7

問題。結局のところ、<security>ノードを持つ<basicHttpBinding>を設定していない私の問題ではなく、IISの問題ではありませんでした。バインディングとその仕組みについて徹底的に読んでいないので、<basicHttpBinding>の横に<wsHttpBinding>を追加すると、WCFのSSLサポートが追加されると考えました。

<security>ノードでデフォルトの<wsHttpBinding>を設定すると、内部的にはまだ<basicHttpBinding>が使用されていても、SOAPメタデータを安全に取得できましたが、POSTはサポートされませんでした。

transport clientCredentialTypeNoneとしたので、私は自分の設定を更新し、それが問題を解決:

<bindings> 
    <basicHttpBinding> 
     <binding name="QBService_BasicHttpBinding"> 
      <security mode="Transport"> 
       <transport clientCredentialType="None" /> 
      </security> 
      <readerQuotas maxDepth="15" maxStringContentLength="524288" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 
2

あなたのサービスは.svcで終わるアドレスでHTTP POSTを待ち受けます。複数のサービス契約がある場合は、<path to .svc>/<serviceContractname>

のように、各契約をホストします。SOAP 1.1に一致するXML文書をPOSTする必要があるためサービスがSOAP要求を期待しています(basicHttpBindingの既定値)。これを実現する最も簡単な方法は、クライアントプロジェクトのAdd Service Referenceを使用してプロキシを作成し、生成されたプロキシクラスをコールすることです.WCF配管は適切なメッセージを生成してサービスに送信します。

+0

問題は、HTTP GETが働くことに対し、404でHTTPのPOST結果をやっていることです。また、VS 2010内からIIS Expressを使用してVS 2010 WCFプロジェクトをデバッグすると、HTTP POSTSが正常に動作することに気付きました。IISを介してホストされている場合にのみ、この現象が発生しているようです。 –

+0

「メタデータは取得できますが、サービスリクエストを作成するのは404で失敗します」と表示する方が便利だと思います。私はあなたがGETをサービス参照の追加やブラウザを使って作成していると仮定し、リクエストを使ってPOSTが生成されたプロキシと思ったのは正しいですか? –

+0

また、あなたのサービスはいくつのサービス契約を実装していますか? –

関連する問題