8

WCF実行時にサービスを作成しようとしています。私のサービスインターフェースは次のとおりです。

[ServiceContract]
public interface IInformationService : IService
{
    [OperationContract]
    [WebInvoke(Method = "Get", ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "Test",     RequestFormat  = WebMessageFormat.Json)]
    string Test();
}

私は次のようにサービスを提供しています:

var httpEnumerator = ImplementedContracts.Values.GetEnumerator();
httpEnumerator.MoveNext();

var httpContractType = httpEnumerator.Current.ContractType;
var webBinding = new WebHttpBinding()
                 {
                   Security =
                   {
                     Mode = WebHttpSecurityMode.None
                   }
                 };

var httpEndpoint = AddServiceEndpoint(
  httpContractType, 
  webBinding, baseAddress+/Get"
);

httpEndpoint.Behaviors.Add(new CustomEndpointBehavior());

ServiceHost は次のメソッドで作成されます。

protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
  var host = new WcfServiceHost(serviceType, baseAddresses);

  if (host.Description.Behaviors.Contains(typeof(ServiceDebugBehavior)))
  {
    (host.Description.Behaviors[typeof(ServiceDebugBehavior)] as 
    ServiceDebugBehavior).IncludeExceptionDetailInFaults = true;
  }
  else
  {
    var debug = new ServiceDebugBehavior
                {
                  IncludeExceptionDetailInFaults = true
                };

    host.Description.Behaviors.Add(debug);
  }

  if (host.Description.Behaviors.Contains(typeof(ServiceMetadataBehavior)))
  {
    (host.Description.Behaviors[typeof(ServiceMetadataBehavior)] as ServiceMetadataBehavior).HttpGetEnabled = true;
    (host.Description.Behaviors[typeof(ServiceMetadataBehavior)] as ServiceMetadataBehavior).HttpsGetEnabled = true;
  }
  else
  {
    var smb = new ServiceMetadataBehavior
              {
                HttpGetEnabled = true,
                HttpsGetEnabled = true
              };

    host.Description.Behaviors.Add(smb);
  }

  host.AddServiceEndpoint(
    ServiceMetadataBehavior.MexContractName,
    MetadataExchangeBindings.CreateMexHttpsBinding(),
    "mex"
  );

  host.AddServiceEndpoint(
    ServiceMetadataBehavior.MexContractName,
    MetadataExchangeBindings.CreateMexHttpBinding(),
    "mex"
  );

  return host;
}

サービス ルートの作成:

var serviceRoute = new ServiceRoute(
  "wcf.service/" + service.Value.Name, 
  new WcfServiceHostFactory(), 
  service.Value
);

if (!RouteTable.Routes.Contains(serviceRoute))
{
    RouteTable.Routes.Add(serviceRoute);
}

アドレスを使用して Web ブラウザーから自分のサービスにアクセスしようとすると、

http://localhost/Werp.View/wcf.service/InformationService/Get/Test

次のエラーが表示されます。

<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none">
  <Code>
    <Value>Sender</Value>
    <Subcode>
      <Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">
         a:ActionNotSupported
      </Value>
    </Subcode>
  </Code>

<Reason>
  <Text xml:lang="en-US">
    The message with Action '' cannot be processed at the receiver, due to a 
    ContractFilter mismatch at the EndpointDispatcher. This may be because of 
    either a contract mismatch (mismatched Actions between sender and receiver) 
    or a binding/security mismatch between the  sender and the receiver. Check 
    that sender and receiver have the same contract and the same  binding 
    (including security requirements, e.g. Message, Transport, None).
  </Text>
</Reason>

誰でも私を助けることができますか?

4

3 に答える 3

4

WebHttpBehaviorをエンドポイントに追加すると、問題は解決しました

httpEndpoint.Behaviors.Add(new WebHttpBehavior());
于 2012-12-11T09:04:30.487 に答える
4

特定の WCF 機能が必要ない場合、または WCF を使用する義務がある場合は、REST ベースのサービスに別のスタックを使用することを検討する必要があります。たとえば、ASP.NET Web APIServiceStackなどです。単純な REST 呼び出しを行うのは大変な作業のようです。

サービス診断をオンにすると、問題の診断に役立つ場合があります。詳細な手順については、このSO を参照してください。

このSO: WCF - ContractFilter mismatch at the EndpointDispatcher exceptionも参考にしてください。

于 2012-12-06T19:47:32.907 に答える