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>
コードと構成は同じです(ただし、構成はサービスアプリケーションのWeb.configとサービスライブラリの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
ます。