【发布时间】:2011-03-28 09:36:11
【问题描述】:
更新我的 WCF 客户端的服务引用时(只需在 Visual Studio 2008 中单击 更新服务引用),出现以下错误:
System.ServiceModel.FaultException: 带有动作的消息 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get' 无法在接收方处理, 由于 ContractFilter 不匹配 端点调度程序。这可能是 因为合同不匹配 (发送方和发送方之间的操作不匹配 接收者)或绑定/安全 发件人和收件人不匹配 接收者。检查发件人和 接收方具有相同的合同和 相同的绑定(包括安全 要求,例如消息,传输, 没有)。在 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
{
...
}
问题是,当我在 ApplyDispatchBehavior 方法中注释掉 foreach 循环时,我得到 no 错误,但这不是出路(因为我希望我的错误处理)。
下面是我的服务配置:
<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>
有人可以帮我吗?
更新
前面显示的代码:
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType));
}
为所有端点添加自定义错误处理 - 包括元数据之一。但实际上这不是问题的根源 - 即使我禁用为元数据端点添加错误处理,问题仍然存在。
另一个通知是,当我将第一个端点的bindingConfiguration 更改为DefaultBinding 时,我根本没有 no 错误:
<services>
<service behaviorConfiguration="DefaultBehavior" name="MyService">
<endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="DefaultBinding"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
这样的选项也不是我想要的——我仍然需要有问题的NoSecurityBinding 才能工作。
提前致谢。
【问题讨论】:
标签: c# .net wcf web-services