Я пытаюсь реализовать поведение обработки ошибок на службе WCF, которая будет использовать 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;
}
}
Я тогда реализовать услугу, которая использует поведение. Это отлично работает, если я объявить переменную Илог в рамках услуги
[AErrorHandlerBehavior]
public class AService : IAService
{
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
....//various methods
}
Однако, когда переменная Илог не объявлена лесозаготовительной перестает работать.
[AErrorHandlerBehavior]
public class AService : IAService
{
//private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
....//various methods
}
В идеале я не хочу, чтобы объявить переменную Илог в каждой службе я произвожу, особенно если он уже объявлен в поведении.
Не могли бы вы объяснить, пожалуйста, почему это должно быть объявлено как в поведении, так и в сервисе. и b) любой способ избежать двойного объявления или c) лучший способ регистрации в wcf.
Andras, спасибо за ответ. Я изо всех сил пытаюсь понять, как получить описание сервиса. Любой шанс указателя на то, как это получить. То, что я действительно пытаюсь сделать, это получить начальное место, в которое была выброшена ошибка. У меня такое чувство, что это может быть немного сложно, если смотреть на журнал, который регистрирует, что ошибка возникает в поведении. Что, конечно, имеет смысл, но не то, что я хочу – KiwiInLondon
на самом деле я был немного толстым, должно быть, немного рано утром. Теперь я вижу параметр serviceDescription. Надо надевать очки. Спасибо за вашу помощь – KiwiInLondon