2010-05-22 11 views
5

Wir arbeiten an einer 3-Tier-Anwendung, und wir durften die neuesten und besten (MVC2, IIS7.5, WCF, SQL2k8, usw.) verwenden. Die Anwendungsebene wird von WCF-Diensten für die verschiedenen Webanwendungen verfügbar gemacht. Da wir sowohl die Service- als auch die Client-Seite kontrollieren, haben wir uns entschieden, net.tcp-Bindungen für ihren Leistungsvorteil gegenüber HTTP zu verwenden.Elmah für Nicht-HTTP-Protokollanwendungen ODER Elmah ohne HttpContext

Wir möchten ELMAH für die Fehlerprotokollierung verwenden, sowohl für die Web-Anwendungen als auch für die Dienste. Hier ist meine Frage. Es gibt viele Informationen über die Verwendung von ELMAH mit WCF, aber es ist alles für HTTP-Bindungen. Weiß jemand, ob und wie Sie ELMAH mit WCF-Diensten verwenden können, die Nicht-HTTP-Endpunkte offen legen?

Meine Vermutung ist nein, denn ELMAH möchte den HttpContext, der das Flag in der Datei web.config erfordert. Von MSDN:

IIS 7.0 und WS ermöglicht Dienste WCF-Protokolle für die Kommunikation über andere als HTTP. WCF-Dienste, die in Anwendungen ausgeführt werden, die den ASP.NET-Kompatibilitätsmodus aktiviert haben, dürfen jedoch keine Nicht-HTTP-Endpunkte bereitstellen. Eine solche Konfiguration generiert eine Aktivierungsausnahme, wenn der Dienst seine erste Nachricht erhält.

Wenn es wahr ist, dass Sie nicht ELMAH mit WCF-Dienste mit Nicht-HTTP-Endpunkte verwenden können, dann ist die nächste Frage ist: Können wir ELMAH in einer Weise, die nicht Httpcontext braucht? Oder allgemeiner (um den Fehler thin metal ruler nicht zu begehen), gibt es irgendeine Möglichkeit, ELMAH mit WCF-Diensten zu verwenden, die Nicht-HTTP-Endpunkte haben?

Hinweis: Ich bin mir bewusst, dass wir den Elmah-Quellcode herunterladen und ändern können, um eine Shim hinzuzufügen oder die HttpContext-Abhängigkeit zu entfernen, aber ich versuche, den Code zu vermeiden.

+0

check this out Könnte Elmah für die Verwendung von in Konsolen-Apps - einige davon könnten in Ihrer Situation nützlich sein: http://stackoverflow.com/questions/841451/using-elmah-in-a-console-application – user1191559

Antwort

5

Nr ELMAH ist ein HTTP-Modul, und es sei denn, Sie HTTP-Anforderungen dienen, ELMAH wird nichts tun,

+0

Ja, das ist die Schlussfolgerung, zu der ich auch gekommen bin. Ich habe versucht, gefälschte HttpContext-Objekte zu erstellen und bin nicht sehr weit gekommen. – Josh

+1

Es ist möglich. Siehe meine Antwort unten. – IsmailS

+0

das ist nicht wahr !!! Sie können Elmah auf jedem Code verwenden! [google groups - blättern Sie nach unten] (https://groups.google.com/forum/#!topic/elmah/nqS1FCD9Xfo) – Yuki

0

Haben Sie versucht, die Methode static void AppInitialize() {} zu initialisieren? Es funktioniert mit Nicht-HTTP-Endpunkten, wenn WCF-bezogene Dinge initialisiert werden.

Weitere Informationen finden Sie Wenlong Dong ausgezeichnete Blog-Post: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

HTH,

--larsw

+0

Ich sehe nicht, was uns das bringt. AppInitialize ist ein möglicher Ersatz für Application_Start in Nicht-HTTP-Anwendungen, wird jedoch nicht bei jeder Anfrage ausgelöst oder erstellt einen Kontext. – Josh

2

Es ist möglich, wie unten

Elmah.ErrorLog.GetDefault(null).Log(new Error(ex)); 

Referenz: http://groups.google.com/group/elmah/browse_thread/thread/9ea4b51420fd5dfa

Früher habe ich versucht, this Lösung für WCF-Dienst zusätzlich AspNetCompatibility Modus und es hat WCF-Dienst nicht funktionierte auf IIS gehostet, aber es funktioniert auf dev-Server gehostet WCF-Dienst innerhalb von Visual Studio. Daher musste ich mich mit der obigen Lösung zufrieden geben.

+0

Vielen Dank für Ihre Antwort. Leider unterstützt Visual Studio keine net.tcp-Bindungen für WCF-Dienste (oder für Nicht-HTTP-Bindungen). Das bedeutet, dass Sie wirklich nur das Standardverhalten von Elmah für HTTP-Anwendungen getestet haben. – Josh

+0

Vergessen Sie nicht, den Anwendungsnamen in der Konfiguration von elmah hinzuzufügen. es wird klappen! – Yuki

0

Wir verwenden Enterprise Library Exception Handling Block in Verbindung mit ELMAH, um Ausnahmen zu protokollieren. Anstatt irgendwelche HTTP-Module zu verwenden, verwendet es das aufrufende Protokoll direkt zu ELMAH.

public class ErrorHandlerServiceBehaviour : BehaviorExtensionElement, IServiceBehavior 
    { 
     #region BehaviourExtensionElement Members 

     public override Type BehaviorType 
     { 
      get { return typeof(ErrorHandlerServiceBehaviour); } 
     } 

     protected override object CreateBehavior() 
     { 
     return new ErrorHandlerServiceBehaviour(); 
    } 

    #endregion 

    #region IServiceBehavior Members 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers) 
     { 
      channelDispatcher.ErrorHandlers.Add(new ElmahExceptionHandler()); 
     } 
    } 

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
    } 

    #endregion 

} 

Dann wird die Exception

public class ElmahExceptionHandler : IErrorHandler 
    { 
     #region IErrorHandler Members 

     public bool HandleError(Exception error) 
     { 
      return ExceptionPolicy.HandleException(error, "ServiceExceptions"); 
     } 

     public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
     { 

     } 

     #endregion 
    } 

dann in der Enterprise Library Ausnahme Politik Abschnitt app.config

<exceptionHandling> 
    <exceptionPolicies>  
    <add name="ServiceExceptions"> 
     <exceptionTypes> 
      <add type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
      postHandlingAction="NotifyRethrow" name="Exception"> 
      <exceptionHandlers> 
       <add type="DB.Framework.Logging.ElmahExceptionHandler, DinguBlue.Framework.Logging" 
       name="Elmah Exception Handler" /> 
      </exceptionHandlers> 
      </add> 
     </exceptionTypes> 
     </add> 
    </exceptionPolicies>  
</exceptionHandling> 

siehe zum Beispiel http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspx