我想實現在將使用log4net的記錄異常WCF,IErrorHandler和log4net的
[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;
}
}
然後我實現使用行爲的服務的WCF服務的錯誤處理行爲。如果我在服務內聲明的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變量在我每次產生的服務,特別是當它在行爲已聲明。
有人可以請解釋一)爲什麼這必須在行爲和服務中聲明。和b)避免雙重聲明的任何方法或c)更好的登錄wcf的方法。
Andras,感謝您的回覆。我很努力地看到如何獲得服務描述。指示如何獲得此信息的任何機會。我真正想要做的是得到錯誤拋出的最初位置。我有一種感覺,這可能有點困難,因爲看着日誌記錄錯誤是在行爲中拋出。這當然是有道理的,但不是我想要的 – KiwiInLondon 2011-01-25 08:33:48