C# EndpointDispatcher上的ContractFilter不匹配(错误处理)

C# EndpointDispatcher上的ContractFilter不匹配(错误处理),c#,.net,wcf,web-services,C#,.net,Wcf,Web Services,更新我的WCF客户端的服务引用时(只需在Visual Studio 2008中单击更新服务引用),出现以下错误: System.ServiceModel.FaultException: 信息与行动 '' 无法在接收器上处理, 由于在上的ContractFilter不匹配 端点调度器。这可能是 因为合同不匹配 (发送方和接收方之间的操作不匹配) (接收方)或绑定/担保 发送方和服务器之间不匹配 接受者检查发送者和 接收方具有相同的合同和 相同的绑定(包括安全性) 要求,例如信息、传输、, 没有)。

更新我的WCF客户端的服务引用时(只需在Visual Studio 2008中单击更新服务引用),出现以下错误:

System.ServiceModel.FaultException: 信息与行动 '' 无法在接收器上处理, 由于在上的ContractFilter不匹配 端点调度器。这可能是 因为合同不匹配 (发送方和接收方之间的操作不匹配) (接收方)或绑定/担保 发送方和服务器之间不匹配 接受者检查发送者和 接收方具有相同的合同和 相同的绑定(包括安全性) 要求,例如信息、传输、, 没有)。在 System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch(异常 e、 信息(信息)

背景:

我已经创建了
errorServiceBehavior
类。因为这样的行为是为错误处理而创建的,
IErrorHandler
实现必须应用于每个
ChannelDispatcher

public class ErrorServiceBehaviour : Attribute, IServiceBehavior
{
   ...
   public Type FaultType
   {
      get { return _faultType; }
      set { _faultType = value; }
   }

   public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
   {
       foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
       {
           dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType));
       }
   }
}

public class ErrorHandler : IErrorHandler
{
     public ErrorHandler(Type faultType)
     {
        _faultType = faultType;         
     }
     ...
}
稍后,我通过将
ErrorServiceBehavior
属性应用于我的服务类来使用该行为:

[ErrorServiceBehavior(FaultType = typeof(MyServiceFault))] 
public class MyService : IMyService
{
   ...
}
问题是,当我在
ApplyDispatchBehavior
方法中注释掉
foreach
循环时,我得到了一点错误都没有,但这不是出路(因为我希望我的错误得到处理)

下面是我的服务配置:

<system.serviceModel>
    <services>
        <service behaviorConfiguration="DefaultBehavior" name="MyService">
            <endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="NoSecurityBinding"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="DefaultBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="NoSecurityBinding" >
                <security mode="None">
                    <transport clientCredentialType="None"/>
                    <message establishSecurityContext="false"/>
                </security>
            </binding>
            <binding name="DefaultBinding" />
        </wsHttpBinding>
    </bindings>
</system.serviceModel>
为所有端点(包括元数据端点)添加自定义错误处理。但实际上这并不是问题的根源——即使我禁用了为元数据端点添加错误处理,问题仍然会发生

另一个注意事项是,当我将第一个端点的
bindingConfiguration
更改为
DefaultBinding
时,我没有任何错误:

<services>
    <service behaviorConfiguration="DefaultBehavior" name="MyService">
        <endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="DefaultBinding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
</services>

这样的选项也不是我想要的-我仍然需要有问题的
NoSecurityBinding
才能工作


提前感谢。

查看,它用于处理仍然能够相互通信的web服务的不同版本。这样,合同就不需要完全匹配。希望这能有所帮助。

关于您所说的,您的新的WCF服务似乎确实需要安全性,而在您的NoSecurityBinding中,您将其关闭。 一种检查方法是在本地获取WSDL文件,看看它是否有:或类似导入中的内容。我很确定你更新的WCF服务已经启用了安全性


更新1


为了更好地了解问题,可以使用WCF跟踪。在这里,您可以看到如何打开它以及如何读取跟踪:

我认为您没有完全关闭安全性。试试这个:

<bindings>
        <wsHttpBinding>
            <binding name="NoSecurityBinding" >
                <security mode="None">
                    <transport clientCredentialType="None"/>
                    <message clientCredentialType="None"/>
                </security>
            </binding>
            <binding name="DefaultBinding" />
        </wsHttpBinding>
    </bindings>

现有的web.config设置可能会产生问题,就像以前版本一样。 最好从WCF客户端应用程序中删除现有引用,然后再次添加引用。


<services>
  <service behaviorConfiguration="ServiceBehaviour" name="Service">
    <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="IService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

首先,我注意到您尝试将mexHttpBinding绑定到端点,尽管它从未在“Bindings”标记中定义过。这应该是一个例外,我希望这样的例外看起来像是一个困扰你的例外

 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

...

<bindings>
    <mexHttpBinding>
        THIS TAG WAS MISSING (add security features as needed)
    </mexHttpBinding>

    <basicHttpBinding>
        <binding name="NoSecurityBinding" >
            <security mode="None" />
        </binding>
        <binding name="DefaultBinding" />
    </basicHttpBinding>
</bindings>

...
缺少此标记(根据需要添加安全功能)
另外,由于您显然不需要任何安全特性,您可能希望使用basicHttpBinding。如上所述,当您需要安全功能时,wsHttpBinding确实很有用

您的配置将几乎相同,将“ws”更改为“basic”



检查
App.Config
并验证它是否指向已部署的Windows服务主机,或将其设置为指向
localhost

虽然您的答案可能会解决问题,但如果您能提供问题的描述以及您的答案如何解决问题,则效果总是更好。这是一个进一步改进此答案和未来答案的建议。我会记住它。。。!!谢谢你的建议。谢谢你的回答。不过,我不打算证实这一点,因为这个问题是5年前提出的。尽管如此,我还是很欣赏它。哇,它突然出现在“未回答”的问题中,我没想到系统会推出这样的老话题。无论如何,干杯。
 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

...

<bindings>
    <mexHttpBinding>
        THIS TAG WAS MISSING (add security features as needed)
    </mexHttpBinding>

    <basicHttpBinding>
        <binding name="NoSecurityBinding" >
            <security mode="None" />
        </binding>
        <binding name="DefaultBinding" />
    </basicHttpBinding>
</bindings>
<system.serviceModel>
<services>
    <service behaviorConfiguration="DefaultBehavior" name="MyService">
        <endpoint address="" binding="basicHttpBinding" contract="IMyService" bindingConfiguration="NoSecurityBinding"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
</services>
<behaviors>
    <serviceBehaviors>
        <behavior name="DefaultBehavior">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
    </serviceBehaviors>
</behaviors>
<bindings>
    <basicHttpBinding>
        <binding name="NoSecurityBinding" >
            <security mode="None" />
        </binding>
        <binding name="DefaultBinding" />
    </basicHttpBinding>
</bindings>