在更新我的WCF客户端的服务引用(只需点击更新服务引用在Visual Studio 2008中)不匹配,出现下列错误:ContractFilter在EndpointDispatcher(错误处理)
System.ServiceModel。 FaultException: 由于在EndpointDispatcher的 处出现ContractFilter不匹配,因此无法在接收方 处理带有动作 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get' 的消息。由于合同不匹配 (发件人与 收件人之间的不匹配操作)或发件人与 收件人之间的绑定/安全 不匹配,可能是 。检查发件人和 收件人是否具有相同的合同和 相同的绑定(包括安全 要求,例如消息,传输, 无)。在 System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch(例外 E,消息消息)
背景:
我已经创建ErrorServiceBehaviour
类。因为这种行为是为错误处理而创建的,所以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
{
...
}
的事情是,当我注释掉foreach
循环内ApplyDispatchBehavior
方法,我得到没有错误,但这不是出路(因为我想要处理我的错误)。
下面有我的服务配置:
<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>
有人能帮助我吗?前面所示
UPDATE
代码:
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType));
}
增加了自定义错误处理所有端点 - 包括元数据之一。但实际上,这是而不是问题的根源 - 即使我禁止为元数据端点添加错误处理,问题仍然会发生。
的其他通知是,当我改变的第一个端点的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
工作。
在此先感谢。
尽管您的答案可能会解决问题,但如果您可以提供关于问题是什么以及答案如何解决问题的说明,那将会更好。这是一个进一步改善这个和未来答案的建议。 – 2014-11-12 12:17:43
将保持在我的脑海里!感谢您的建议 – 2014-12-23 06:56:02