2010-05-22 13 views
5

Estamos trabajando en una aplicación de 3 niveles, y hemos sido autorizados a utilizar lo último y lo mejor (MVC2, IIS7.5, WCF, SQL2k8, etc.). El nivel de aplicación está expuesto a las diversas aplicaciones web por los servicios de WCF. Como controlamos tanto el servicio como el lado del cliente, hemos decidido usar enlaces net.tcp para su ventaja de rendimiento a través de HTTP.Elmah para aplicaciones de protocolo no HTTP O Elmah sin HttpContext

Queremos usar ELMAH para el registro de errores, tanto en las aplicaciones web como en los servicios. Aquí está mi pregunta Hay mucha información sobre el uso de ELMAH con WCF, pero es todo para enlaces HTTP. ¿Alguien sabe si/cómo puede usar ELMAH con servicios WCF exponiendo puntos finales que no son HTTP?

Supongo que no, porque ELMAH quiere el HttpContext, que requiere que la bandera AspNetCompatibilityEnabled sea verdadera en el archivo web.config. De MSDN:

IIS 7.0 y WAS permite que los servicios de WCF se comuniquen a través de protocolos que no sean HTTP. Sin embargo, los servicios WCF que se ejecutan en aplicaciones que tienen habilitado el modo de compatibilidad ASP.NET no tienen permitido exponer puntos finales que no sean HTTP. Tal configuración genera una excepción de activación cuando el servicio recibe su primer mensaje.

Si bien es cierto que no se puede utilizar ELMAH con servicios WCF con terminales que no son HTTP, entonces la pregunta de seguimiento es: ¿Podemos utilizar ELMAH de tal manera que no necesita HttpContext? O en términos más generales (para no cometer el error thin metal ruler), ¿hay ALGUNA forma de utilizar ELMAH con servicios WCF que tengan puntos finales que no sean HTTP?

Nota: Soy consciente de que podemos descargar el código fuente de Elmah y cambiarlo para agregar una corrección o eliminar la dependencia HttpContext, pero estoy tratando de evitar forzar el código.

+0

pueda comprobar esto para usar Elmah en aplicaciones de consola, algunas de ellas pueden ser útiles en su situación: http://stackoverflow.com/questions/841451/using-elmah-in-a-console-application – user1191559

Respuesta

5

Nº ELMAH es un módulo HTTP, ya menos que usted está sirviendo peticiones HTTP, ELMAH no hará nada

+0

Sí, esa es también la conclusión a la que he llegado. Intenté crear objetos falsos HttpContext y no pude llegar muy lejos. – Josh

+1

Es posible. Ver mi respuesta a continuación. – IsmailS

+0

esto no es verdad! puedes usar elmah en cualquier código! [grupos de google - desplácese hacia abajo] (https://groups.google.com/forum/#!topic/elmah/nqS1FCD9Xfo) – Yuki

0

¿Ha intentado utilizar el método static vacid AppInitialize() {} para inicializarlo? Funciona con puntos finales que no sean HTTP al inicializar cosas relacionadas con WCF.

Para obtener más información, véase el excelente blog de Wenlong Dong: http://blogs.msdn.com/b/wenlong/archive/2006/01/11/511514.aspx

HTH,

--larsw

+0

No veo lo que eso nos da. AppInitialize es un posible reemplazo para Application_Start en aplicaciones que no son HTTP, pero que no se activa en cada solicitud o crea contexto. – Josh

2

es posible que más adelante

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

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

Antes he intentado this solución para servicio WCF, además del modo AspNetCompatibility y no trabajó en IIS alojado servicio WCF, pero estaba trabajando en el servidor dev servicio WCF alojado dentro de Visual Studio. Por lo tanto, tenía que satisfacerme con la solución anterior.

+0

Gracias por su respuesta. Desafortunadamente, Visual Studio no admite enlaces net.tcp para servicios WCF (o cualquier enlace que no sea HTTP, para el caso). Eso significa que lo que probaste es realmente solo el comportamiento estándar de Elmah para las aplicaciones HTTP. – Josh

+0

no se olvide de agregar el nombre de la aplicación en la configuración de Elmah. ¡funcionará! – Yuki

0

Utilizamos el bloque Enterprise Enterprise Exception Handling junto con ELMAH para registrar excepciones. En lugar de utilizar cualquier módulo HTTP, utiliza el registro de llamadas a ELMAH directamente.

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 

} 

Entonces el 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 
    } 

continuación, en el apartado de condiciones de excepción de la biblioteca de la empresa 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> 

ver por ejemplo http://dotnetslackers.com/articles/aspnet/Getting-ELMAH-to-work-with-WCF-services.aspx