1

WCF サービス構成の問題に苦しんでいます。私は次の設定を持っています:

<behaviors>
  <serviceBehaviors>
    <behavior name="SampleWebBehavior">
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
    <behavior name="MyServiceTypeBehaviors">
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<protocolMapping>
  <add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/>

完全に機能します。WcfTestClient.exe でメソッドを試して、正しい応答を得ることができます。しかし、バインディングを webHttpBinding にする必要があるため、ブラウザで結果を確認し、JSON リクエストとレスポンスを作成できます。しかし、バインディングをwebHttpBindingに変更すると、エラーがスローされます。

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

助けてくれてありがとう。

4

2 に答える 2

1

これをやってのけるには、設定でいくつかのことを行う必要があります

1) サービスに別のエンドポイントを追加します。以下に示すように、basicHttp と webHttp の両方があります。

    <system.serviceModel>
        <services>
          <service name="<serivceclass>" behaviorConfiguration="DefaultBehavior">
            <endpoint binding="basicHttpBinding" contract="<serviceinterface>" bindingConfiguration="soapBinding"/>
            <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="<serviceinterface>" bindingConfiguration="jsonBinding"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
 </system.serviceModel>

2) バインディング構成を追加します (ここでも web と basichttp の両方が表示されます)。

<system.serviceModel>
<bindings>
      <basicHttpBinding>
        <binding name="soapBinding" maxBufferPoolSize="9000000" maxBufferSize="9000000" maxReceivedMessageSize="9000000">
          <readerQuotas maxArrayLength="9000000" maxBytesPerRead="9000000" maxDepth="9000000" maxNameTableCharCount="9000000" maxStringContentLength="9000000"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="jsonBinding">
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>   
  </system.serviceModel>

3) 動作をセットアップします。名前と、ステップ 1 でリストされたエンドポイントとの相関関係に注目してください。

<system.serviceModel>    
<behaviors>
          <endpointBehaviors>
            <behavior name="jsonBehavior">
              <webHttp defaultOutgoingResponseFormat="Json" />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="DefaultBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <dataContractSerializer maxItemsInObjectGraph="9000000" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
</system.serviceModel>

私が有効にして構成するもののいくつかはオプションですが、これにより、Web と json のものを使用する方法と、javascript などで作業していないときに Visual Studio に組み込まれているツールを使用する方法の両方でサービスにアクセスできます。

注 1: json 部分を使用している場合のエンドポイントは、たとえばhttp://myhost.com/myservice.svc/json/MyMethodNameになります。これは、サービスの適切なエンドポイント行の「アドレス」属性を変更することで変更できます。 (基本アドレスが空で、webHttp が「json」であることを確認してください)

于 2012-09-21T14:06:47.197 に答える
0

このエラーの原因の 1 つの可能性は次のとおりです。構成を変更したときに、サーバーまたはクライアントで変更を行いましたが、両方ではありませんでした。サーバーとクライアントの構成は一致している必要があります。

于 2012-09-21T14:11:30.433 に答える