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