我正在尝试在将使用 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 的更好方式。