在更新我的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