Ich versuche, mit dem Tool IErrorHandler zu signalisieren, elmah nicht behandelte Ausnahmen zu protokollieren.Elmah-Protokollierung mit IErrorHandler funktioniert nicht, wenn in nicht WCF-Projekt implementiert
Ich hatte mehrere Projekte in meiner Lösung. Ich habe ein Dienstprogramm-Projekt, wo ich IErrorHandler implementiert habe.
public abstract class BaseWebServiceErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error == null) return;
if (System.Web.HttpContext.Current == null)
{
ErrorLog.GetDefault(null).Log(new Error(error));
}
else
{
ErrorSignal.FromCurrentContext().Raise(error);
}
}
}
public class ServiceErrorBehaviourAttribute : Attribute, IServiceBehavior
{
Type errorHandlerType;
public ServiceErrorBehaviourAttribute(Type errorHandlerType)
{
this.errorHandlerType = errorHandlerType;
}
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
var errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
foreach (var channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
var channelDispatcher = channelDispatcherBase as ChannelDispatcher;
channelDispatcher?.ErrorHandlers.Add(errorHandler);
}
}
}
Und in eines des WCF Projekt, das ich eine BaseWebService Klasse, wo ich das Betriebsverhalten zu verwenden versuchen Attribut
[ServiceErrorBehaviour(typeof(WebServiceErrorHandler))]
public abstract class BaseWebService : AbstractWebService
{
public BaseWebService()
{
//Code logic
}
}
public class WebServiceErrorHandler : BaseWebServiceErrorHandler
{
}
nun mit dem obigen Code, wenn eine nicht behandelte Ausnahme, die ich Störung erhalte auftritt dass das Dienstverhalten nicht übereinstimmt.
aber wenn ich die Definition von IErrorHandler in meinem BaseWebService habe, funktioniert es.
[ServiceErrorBehaviour(typeof(WebServiceErrorHandler))]
public abstract class BaseWebService : AbstractWebService
{
public BaseWebService()
{
//Codelogic
}
}
//public class WebServiceErrorHandler : BaseWebServiceErrorHandler
//{
//}
public class WebServiceErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error == null) return;
if (System.Web.HttpContext.Current == null)
{
ErrorLog.GetDefault(null).Log(new Error(error));
}
else
{
ErrorSignal.FromCurrentContext().Raise(error);
}
}
}
mit der obigen Implementierung funktioniert es gut und wird in Elmah auch eingeloggt.
Fehle ich eine Referenz im Utility-Projekt? Schätzen Sie Ihre Vorschläge.
Ich schrieb dieses Handbuch: [zu ELMAH von WCF Logging] (https://docs.elmah.io/logging-to-elmah-io-from-wcf /) was helfen kann. Ich poste das nicht als Antwort, da ich das nie mit Basisklassen getestet habe. – ThomasArdal
@ThomasArdal Ich habe eine ähnliche Implementierung gemacht, aber nicht sicher, warum es nicht mit der Basisklasse funktioniert, wie Sie gesagt haben. – user824910