Estoy ejecutando el modo integrado de IIS 7 y obtengo
La solicitud no está disponible en este contexto
cuando intento acceder a él en una función relacionada con Log4Net que se llama desde Application_Start
. Esta es la línea de código que tengo
if (HttpContext.Current != null && HttpContext.Current.Request != null)
y se lanza una excepción para una segunda comparación.
¿Qué más puedo verificar además de verificar HttpContext.Current.Request para nulo?
Se publica una pregunta similar @ La solicitud no está disponible en esta excepción de contexto cuando se ejecuta mvc en iis7.5
pero tampoco hay una respuesta relevante.
Respuestas:
Consulte el modo integrado IIS7: la solicitud no está disponible en este contexto, la excepción en Application_Start :
fuente
Cuando tiene una lógica de registro personalizada, es bastante molesto verse obligado a no registrar application_start o tener que permitir que ocurra una excepción en el registrador (incluso si se maneja).
Parece que en lugar de probar la
Request
disponibilidad, puede probar laHandler
disponibilidad: cuando no hayRequest
, sería extraño tener todavía un controlador de solicitudes. Y probarHandler
no genera esa temidaRequest is not available in this context
excepción.Entonces puede cambiar su código a:
Tenga cuidado, en el contexto de un módulo http,
Handler
sin embargo , puede no estar definidoRequest
yResponse
está definido (lo he visto en el evento BeginRequest). Entonces, si necesita un registro de solicitud / respuesta en un módulo http personalizado, mi respuesta puede no ser adecuada.fuente
Este es un caso muy clásico: si termina teniendo que verificar los datos proporcionados por la instancia http, considere mover ese código debajo del
BeginRequest
evento.Este es el lugar adecuado para verificar los encabezados http, la cadena de consulta, etc.
Application_Start
Es para las configuraciones que se aplican a la aplicación durante todo el tiempo de ejecución, como enrutamiento, filtros, registro, etc.Por favor, no aplique ninguna solución alternativa , como .ctor estático o cambiar al modo clásico, a menos que no haya forma de mover el código de
Start
aBeginRequest
. eso debería ser factible para la gran mayoría de sus casos.fuente
Dado que ya no hay contexto de solicitud en la canalización durante el inicio de la aplicación, no puedo imaginar que haya alguna forma de adivinar en qué servidor / puerto podría ingresar la próxima solicitud real. Tienes que hacerlo en Begin_Session.
Esto es lo que estoy usando cuando no estoy en el modo clásico. La sobrecarga es insignificante.
fuente
Según las necesidades detalladas de OP explicadas en los comentarios , existe una solución más adecuada. El OP afirma que desea agregar datos personalizados en sus registros con log4net, datos relacionados con las solicitudes.
En lugar de envolver cada llamada de log4net en una llamada de registro centralizada personalizada que maneja la recuperación de datos relacionados con la solicitud (en cada llamada de registro), log4net presenta diccionarios de contexto para configurar datos adicionales personalizados para registrar. El uso de esos diccionarios permite colocar los datos de registro de su solicitud para la solicitud actual en el evento BeginRequest, luego descartarlos en el evento EndRequest. Cualquier inicio de sesión intermedio se beneficiará de esos datos personalizados.
Y las cosas que no suceden en un contexto de solicitud no intentarán registrar los datos relacionados con la solicitud, eliminando la necesidad de probar la disponibilidad de la solicitud. Esta solución coincide con el principio que sugirió Arman McHitaryan en su respuesta .
Para que esta solución funcione, también necesitará alguna configuración adicional en sus agregadores log4net para que registren sus datos personalizados.
Esta solución se puede implementar fácilmente como un módulo de mejora de registros personalizado. Aquí hay un código de muestra para ello:
Agréguelo a su sitio, muestra de configuración de IIS 7+:
Y configure anexos para registrar esas propiedades adicionales, configuración de muestra:
fuente
Puede solucionar el problema sin cambiar al modo clásico y seguir utilizando Application_Start
Por alguna razón, el tipo estático se crea con una solicitud en su HTTPContext, lo que le permite almacenarlo y reutilizarlo inmediatamente en el evento Application_Start
fuente
Pude solucionar este problema / hackearlo moviéndome al modo "Clásico" desde el modo "integrado".
fuente
Esto funcionó para mí: si tiene que iniciar sesión en Application_Start, hágalo antes de modificar el contexto. Obtendrá una entrada de registro, simplemente sin fuente, como:
2019-03-12 09: 35: 43,659 INFO (nulo) - Aplicación iniciada
Generalmente registro tanto Application_Start como Session_Start, por lo que veo más detalles en el siguiente mensaje
2019-03-12 09: 35: 45,064 INFO ~ / Leads / Leads.aspx - Sesión iniciada (local)
fuente
En Visual Studio 2012, cuando publiqué la solución por error con la opción 'depurar' obtuve esta excepción. Con la opción de 'liberación' nunca ocurrió. Espero eso ayude.
fuente
Puede utilizar lo siguiente:
fuente
haz esto en global.asax.cs:
Funciona de maravilla. this.Context.Request está ahí ...
this.Request lanza una excepción intencionalmente basada en una bandera
fuente