log4netを使用して例外をログに記録するwcfサービスにエラー処理動作を実装しようとしています
[AttributeUsage(AttributeTargets.Class)]
public class AErrorHandlerBehaviorAttribute : Attribute, IServiceBehavior, IErrorHandler{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected Type ServiceType { get; set; }
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
//Dont do anything
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection <ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
//dont do anything
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
ServiceType = serviceDescription.ServiceType;
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(this);
}
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
fault = null; //Suppress any faults in contract
}
public bool HandleError(Exception error)
{
log.Error("Page Load failed : " + error.Message);
return false;
}
}
次に、この動作を使用するサービスを実装します。サービス内でILog変数を宣言すると、これは正常に機能します
[AErrorHandlerBehavior]
public class AService : IAService
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
....//various methods
}
ただし、ILog変数が宣言されていない場合、ロギングは機能しなくなります。
[AErrorHandlerBehavior]
public class AService : IAService
{
//private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
....//various methods
}
理想的には、特にビヘイビアーですでに宣言されている場合は、作成するすべてのサービスでILog変数を宣言する必要はありません。
誰かがa)これが振る舞いとサービスの両方で宣言されなければならない理由を説明してもらえますか?b)二重宣言を回避する方法またはc)wcfにログインするためのより良い方法。