2010-05-22 19 views
5

Nous travaillons sur une application à trois niveaux, et nous avons été autorisés à utiliser les derniers et les meilleurs (MVC2, IIS7.5, WCF, SQL2k8, etc). Le niveau applicatif est exposé aux différentes applications Web par les services WCF. Puisque nous contrôlons à la fois le service et le côté client, nous avons décidé d'utiliser les liaisons net.tcp pour leur avantage de performance par rapport à HTTP.Elmah pour les applications de protocole non-HTTP OU Elmah sans HttpContext

Nous aimerions utiliser ELMAH pour la journalisation des erreurs, à la fois sur les applications Web et les services. Voici ma question. Il y a beaucoup d'informations sur l'utilisation d'ELMAH avec WCF, mais c'est tout pour les liaisons HTTP. Est-ce que quelqu'un sait si/comment vous pouvez utiliser ELMAH avec les services WCF exposant des points de terminaison non-HTTP?

Je suppose que non, parce qu'ELMAH veut le HttpContext, qui exige que le drapeau AspNetCompatibilityEnabled soit vrai dans le web.config. A partir de MSDN:

IIS 7.0 et WAS permettent aux services WCF de communiquer sur des protocoles autres que HTTP. Toutefois, les services WCF exécutés dans des applications qui ont activé le mode de compatibilité ASP.NET ne sont pas autorisés à exposer des points de terminaison non-HTTP. Une telle configuration génère une exception d'activation lorsque le service reçoit son premier message.

S'il est vrai que vous ne pouvez pas utiliser ELMAH avec les services WCF ayant extrémités non-HTTP, la question de suivi est: Peut-on utiliser ELMAH de telle manière qui n'a pas besoin HttpContext? Ou plus généralement (afin de ne pas commettre l'erreur thin metal ruler), existe-t-il un moyen d'utiliser ELMAH avec les services WCF ayant des points de terminaison non-HTTP? Je suis conscient que nous pouvons télécharger le code source Elmah et le modifier pour ajouter un shim ou supprimer la dépendance HttpContext, mais j'essaie d'éviter de forcer le code.

+0

pourrait vérifier cela pour l'utilisation Elmah dans les applications de console - certaines d'entre elles peuvent être utiles dans votre situation: http://stackoverflow.com/questions/841451/using-elmah-in-a-console-application – user1191559

Répondre

5

n ° ELMAH est un module HTTP, et à moins que vous servez des requêtes HTTP, ELMAH ne fera rien

+0

Oui, c'est la conclusion à laquelle je suis parvenu. J'ai essayé de créer de faux objets HttpContext et je ne suis pas allé très loin. – Josh

+1

C'est possible. Voir ma réponse ci-dessous. – IsmailS

+0

ce n'est pas vrai !!! vous pouvez utiliser elmah sur n'importe quel code! [google groups - faites défiler vers le bas] (https://groups.google.com/forum/#!topic/elmah/nqS1FCD9Xfo) – Yuki

0

Avez-vous essayé d'utiliser la méthode vide AppInitialize() {} pour l'initialiser? Il fonctionne avec les points de terminaison non-HTTP lors de l'initialisation de choses liées à WCF.

Pour plus d'informations, voir excellent post de blog Wenlong Dong: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

HTH,

--larsw

+0

Je ne vois pas ce que ça nous apporte. AppInitialize est un remplacement possible pour Application_Start dans les applications non-HTTP, mais cela ne se déclenche pas à chaque demande ou ne crée pas de contexte. – Josh

2

Il est possible comme ci-dessous

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

Référence: http://groups.google.com/group/elmah/browse_thread/thread/9ea4b51420fd5dfa

Plus tôt j'ai essayé solution this pour le service WCF en plus du mode AspNetCompatibility et il n'a pas travaillé sur le service IIS hébergé WCF, mais il travaillait sur le serveur de dev hébergé service WCF dans Visual Studio. Par conséquent, je devais me satisfaire de la solution ci-dessus.

+0

Nous vous remercions de votre réponse. Malheureusement, Visual Studio ne prend pas en charge les liaisons net.tcp pour les services WCF (ou les liaisons non HTTP, d'ailleurs). Cela signifie que ce que vous avez testé est vraiment le comportement standard d'Elmah pour les applications HTTP. – Josh

+0

ne pas oublier d'ajouter le nom de l'application dans la config d'elmah. ça va marcher! – Yuki

0

Nous utilisons le bloc de gestion des exceptions de bibliothèque d'entreprise conjointement avec ELMAH pour consigner les exceptions. Plutôt que d'utiliser des modules HTTP, il utilise directement le journal d'appels à 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 

} 

Puis le 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 
    } 

puis dans la section des politiques d'exception de la bibliothèque d'entreprise de 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> 

voir par exemple http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspx