在实现 IErrorHandler 接口并将其添加到 WCF 服务应用程序中的调度程序时,我遇到了一些奇怪的行为。只有HandleError
方法被触发,而不是ProvideFault
方法。
在 WCF 服务库中使用相同的代码和配置时,两种方法都会在代码中出现异常时触发。
例子:
public class ErrorHandler : IErrorHandler, IServiceBehavior
{
public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)
{
// Provide the fault
}
public bool HandleError(Exception error)
{
// If handled return true, otherwise false
}
// Validate
// AddBindingParameters
// ApplyDispatchBehavior
}
public class ErrorHandlerBehavior : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(ErrorHandler); }
}
protected override object CreateBehavior()
{
return new ErrorHandler();
}
}
在 Web.config 中:
<extensions>
<behaviorExtensions>
<add name="ErrorLogging" type="Service.ErrorHandlerBehavior, Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
...
<serviceBehaviors>
<behavior>
<ErrorLogging />
</behavior>
</serviceBehaviors>
代码和配置是一样的(虽然配置在Service Application的Web.config和Service Library的i App.config)。
通过在 中插入断点,ProvideFault
我HandleError
可以看到ProvideFault
它只为服务库调用- 这怎么可能?我错过了什么吗?
编辑
ProvideFault
当被调用的服务操作的签名具有除原始类型以外的返回类型时,似乎不会调用它,例如:
public IEnumerable<MyType> GetMyType(string s1)
{
throw new Exception("Testing...");
}
...不会触发ProvideFault
.
但:
public bool DoStuff(string s1, string s2)
{
throw new Exception("Testing...");
}
...确实会触发ProvideFault
.