Nous sommes l'aide de l'excellent ELMAH pour traiter les exceptions non gérées dans un ASP.NET 3.5 application web. Cela fonctionne très bien pour tous le site en dehors de la WCF services qui sont consommés en utilisant les fonctionnalités du RESTE. Lorsqu'une exception se produit au sein de l'opération des méthodes qui n'est pas géré par le code de l'application, WCF poignées de différentes manières, selon les contrats de service et les paramètres de configuration. Cela signifie que l'exception ne fait pas la fin de la cuisson, l'ASP.NET HttpApplication.Événement d'erreur ELMAH utilise. Les deux solutions que je suis conscient de traiter ce sont:
- L'emballage de tous les appels de méthode dans un try { } catch(Exception ex) { Elmah.ErrorSignal.FromCurrentContext().Soulever des(ex); throw; } appeler explicitement Elmah dans le bloc catch.
- Utilisation IErrorHandler comme décrit dans la Volonté Hughes blog de Prise de WCF et ELMAH jouer bien ensemble pour le facteur de l'appel à ELMAH à un autre ErrorHandler.
La première option est extrêmement simple, mais n'est pas exactement SÈCHE. La deuxième option ne vous oblige à décorer chaque service avec l'attribut personnalisé après la mise en œuvre de l'attribut et de la ErrorHandler. J'ai fait cela repose sur la Volonté de travailler, mais je veux vérifier que c'est la bonne approche avant de poster le code.
Est-il une meilleure façon que j'ai manqué?
La MSDN documenation pour IErrorHandler dit que le HandleError méthode est l'endroit pour faire l'enregistrement, mais ELMAH accède à la HttpContext.Actuel.ApplicationInstance, qui est nulle dans cette méthode, même si HttpContext.Le courant est disponible. De faire l'appel à Elmah dans le ProvideFault méthode est une solution de contournement comme ApplicationInstance est fixé, mais cela ne correspond pas à l'objectif décrit dans la documentation de l'API. Suis-je manqué quelque chose? La documentation fait état que vous ne devriez pas compter sur la HandleError appel d'une méthode sur l'opération de filetage qui est peut-être pourquoi ApplicationInstance est nul dans ce champ d'application.