Estou executando o modo integrado IIS 7 e estou conseguindo
O pedido não está disponível neste contexto
quando tento acessá-lo em uma função relacionada ao Log4Net que é chamada de Application_Start
. Esta é a linha de código que eu
if (HttpContext.Current != null && HttpContext.Current.Request != null)
e uma exceção está sendo lançada para uma segunda comparação.
O que mais posso verificar além de verificar HttpContext.Current.Request para null ??
Uma pergunta semelhante é postada @ Request is not available in this context exception when runnig mvc on iis7.5
mas nenhuma resposta relevante lá também.
Respostas:
Consulte Modo integrado IIS7: a solicitação não está disponível nesta exceção de contexto em Application_Start :
fonte
Quando você tem uma lógica de registro personalizada, é um tanto chato ser forçado a não registrar o application_start ou ter que permitir que uma exceção ocorra no logger (mesmo se tratada).
Parece que, em vez de testar a
Request
disponibilidade, você pode testar aHandler
disponibilidade: quando não houverRequest
, seria estranho ainda ter um manipulador de solicitações. E o teste deHandler
não levanta aquelaRequest is not available in this context
exceção temida .Portanto, você pode alterar seu código para:
Cuidado, no contexto de um módulo http,
Handler
pode não ser definido emboraRequest
eResponse
esteja definido (eu vi isso no evento BeginRequest). Portanto, se você precisar de registro de solicitação / resposta em um módulo http personalizado, minha resposta pode não ser adequada.fonte
Este é um caso muito clássico: se você acabar tendo que verificar os dados fornecidos pela instância http, considere mover esse código no
BeginRequest
evento.Este é o lugar certo para verificar os cabeçalhos http, string de consulta e etc ...
Application_Start
é para as configurações que se aplicam a todo o tempo de execução do aplicativo, como roteamento, filtros, registro e assim por diante.Por favor, não aplique nenhuma solução alternativa , como estático .ctor ou alternar para o modo Clássico, a menos que não haja como mover o código de
Start
paraBeginRequest
. isso deve ser viável para a grande maioria dos seus casos.fonte
Como não há mais contexto de solicitação no pipeline durante a inicialização do aplicativo, não posso imaginar que haja alguma maneira de adivinhar em qual servidor / porta a próxima solicitação real pode vir. Você tem que fazer isso em Begin_Session.
Aqui está o que estou usando quando não estou no modo clássico. A sobrecarga é insignificante.
fonte
Com base nas necessidades detalhadas do OP explicadas nos comentários , existe uma solução mais apropriada. O OP declara que deseja adicionar dados personalizados em seus logs com log4net, dados relacionados às solicitações.
Em vez de agrupar cada chamada log4net em uma chamada de log centralizada personalizada que lida com a recuperação de dados relacionados à solicitação (em cada chamada de log), o log4net apresenta dicionários de contexto para configurar dados adicionais personalizados a serem registrados. Usar esses dicionários permite posicionar seus dados de registro de solicitação para a solicitação atual no evento BeginRequest e, em seguida, descartá-los no evento EndRequest. Qualquer login no meio se beneficiará desses dados personalizados.
E coisas que não acontecem em um contexto de solicitação não tentarão registrar os dados relacionados à solicitação, eliminando a necessidade de testar a disponibilidade da solicitação. Essa solução corresponde ao princípio que Arman McHitaryan estava sugerindo em sua resposta .
Para que esta solução funcione, você também precisará de algumas configurações adicionais em seus anexadores log4net para que eles registrem seus dados personalizados.
Esta solução pode ser facilmente implementada como um módulo de aprimoramento de log personalizado. Aqui está um exemplo de código para ele:
Adicione ao seu site, amostra de configuração do IIS 7+:
E configurar appenders para registrar essas propriedades adicionais, configuração de amostra:
fonte
Você pode contornar o problema sem alternar para o modo clássico e ainda usar Application_Start
Por algum motivo, o tipo estático é criado com uma solicitação em seu HTTPContext, permitindo armazená-lo e reutilizá-lo imediatamente no evento Application_Start
fonte
Consegui contornar / hackear esse problema passando do modo "integrado" para o modo "Clássico".
fonte
Isso funcionou para mim - se você tiver que fazer logon Application_Start, faça-o antes de modificar o contexto. Você receberá uma entrada de registro, mas sem fonte, como:
12/03/2019 09: 35: 43,659 INFO (nulo) - Aplicativo iniciado
Eu geralmente registro o Application_Start e Session_Start, então vejo mais detalhes na próxima mensagem
12/03/2019 09: 35: 45.064 INFO ~ / Leads / Leads.aspx - Sessão iniciada (local)
fonte
No visual studio 2012, quando publiquei a solução por engano com a opção 'debug', recebi essa exceção. Com a opção de 'liberação', isso nunca ocorreu. Espero que ajude.
fonte
Você pode usar o seguinte:
fonte
faça isso em global.asax.cs:
Funciona como um encanto. this.Context.Request está lá ...
this.Request lança exceção intencionalmente com base em um sinalizador
fonte