2010-05-22 11 views
5

Stiamo lavorando su un'applicazione a 3 livelli e ci è stato concesso di utilizzare le ultime e le più grandi (MVC2, IIS7.5, WCF, SQL2k8, ecc.). Il livello applicazione è esposto alle varie applicazioni Web dai servizi WCF. Dal momento che controlliamo sia il servizio che il lato client, abbiamo deciso di utilizzare i binding net.tcp per il loro vantaggio prestazionale su HTTP.Elmah per applicazioni di protocollo non HTTP O Elmah senza HttpContext

Vorremmo utilizzare ELMAH per la registrazione degli errori, sia nelle app Web che nei servizi. Ecco la mia domanda. Ci sono molte informazioni sull'utilizzo di ELMAH con WCF, ma è tutto per i binding HTTP. Qualcuno sa se/come è possibile utilizzare ELMAH con i servizi WCF che espongono endpoint non HTTP?

La mia ipotesi è no, perché ELMAH vuole HttpContext, che richiede che il flag AspNetCompatibilityEnabled sia true in web.config. Da MSDN:

IIS 7.0 e WAS consente ai servizi WCF di comunicare su protocolli diversi da HTTP. Tuttavia, i servizi WCF in esecuzione in applicazioni che hanno abilitato la modalità di compatibilità ASP.NET non sono autorizzati a esporre endpoint non HTTP. Tale configurazione genera un'eccezione di attivazione quando il servizio riceve il primo messaggio.

Se è vero che non è possibile utilizzare ELMAH con servizi WCF avere endpoint non HTTP, allora la domanda di follow-up è: Possiamo usare ELMAH in modo tale che non ha bisogno HttpContext? O più in generale (per non commettere l'errore thin metal ruler), c'è QUALSIASI modo di utilizzare ELMAH con servizi WCF che hanno endpoint non HTTP?

Nota: Sono consapevole del fatto che siamo in grado di scaricare il codice sorgente Elmah e modificarlo per aggiungere uno spessore o rimuovere la dipendenza HttpContext, ma sto cercando di evitare che si biforcano il codice.

+0

potrebbe verificare questo per l'utilizzo di Elmah nelle app della console: alcune potrebbero essere utili nella tua situazione: http://stackoverflow.com/questions/841451/using-elmah-in-a-console-application – user1191559

risposta

5

No. ELMAH è un modulo HTTP, ea meno che non si sta servendo richieste HTTP, ELMAH non farà nulla

+0

Sì, è un po 'la conclusione che sono arrivato anche io. Ho provato a creare oggetti HttpContext falsi e non sono arrivato molto lontano. – Josh

+1

È possibile. Vedi la mia risposta qui sotto. – IsmailS

+0

questo non è vero !!! puoi usare elmah su qualsiasi codice! [gruppi google: scorri verso il basso] (https://groups.google.com/forum/#!topic/elmah/nqS1FCD9Xfo) – Yuki

0

Hai provato a utilizzare il metodo statico AppInitialize() void per inizializzarlo? Funziona con endpoint non HTTP durante l'inizializzazione di cose relative a WCF.

Per ulteriori informazioni, vedere eccellente post del blog di Wenlong Dong: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

HTH,

--larsw

+0

Non vedo cosa ci provochi. AppInitialize è una possibile sostituzione per Application_Start in applicazioni non HTTP, ma non per ogni richiesta o contesto. – Josh

2

E 'possibile, come di seguito

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

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

Prima ho provato this soluzione per servizio WCF in aggiunta modalità AspNetCompatibility e non ha lavorato su IIS ospitato servizio WCF, ma stava lavorando su servizio WCF in hosting di server dev all'interno di Visual Studio. Quindi ho dovuto soddisfare me stesso con la soluzione di cui sopra.

+0

Grazie per la risposta. Sfortunatamente, Visual Studio non supporta i binding net.tcp per i servizi WCF (o eventuali collegamenti non-HTTP, peraltro). Ciò significa che ciò che hai testato è in realtà solo il comportamento standard di Elmah per le applicazioni HTTP. – Josh

+0

non dimenticare di aggiungere il nome dell'applicazione nella configurazione di elmah. Funzionerà! – Yuki

0

Utilizziamo il blocco di gestione delle eccezioni di Enterprise Library insieme a ELMAH per registrare le eccezioni. Anziché utilizzare qualsiasi modulo HTTP, esso utilizza direttamente il registro delle chiamate su 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 

} 

Poi l'ExceptionHandler

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 
    } 

quindi nella sezione politiche eccezione Enterprise Library di 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> 

vedi ad esempio http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspx