J'exécute le mode intégré IIS 7 et j'obtiens
La demande n'est pas disponible dans ce contexte
lorsque j'essaie d'y accéder dans une fonction liée à Log4Net qui est appelée à partir de Application_Start
. C'est la ligne de code que j'ai
if (HttpContext.Current != null && HttpContext.Current.Request != null)
et une exception est lancée pour la deuxième comparaison.
Que puis-je vérifier d'autre que de vérifier HttpContext.Current.Request pour null ??
Une question similaire est postée @ La demande n'est pas disponible dans cette exception de contexte lors de l'exécution de mvc sur iis7.5
mais pas de réponse pertinente non plus.
Réponses:
Veuillez consulter IIS7 Integrated mode: Request is not available in this context exception in Application_Start :
la source
Lorsque vous avez une logique de journalisation personnalisée, il est plutôt ennuyeux d'être forcé de ne pas journaliser application_start ou de laisser une exception se produire dans le journal (même si elle est gérée).
Il semble qu'au lieu de tester la
Request
disponibilité, vous pouvez tester laHandler
disponibilité: quand il n'y en a pasRequest
, il serait étrange d'avoir encore un gestionnaire de requêtes. Et tester pourHandler
ne soulève pas cetteRequest is not available in this context
exception redoutée .Vous pouvez donc changer votre code en:
Attention, dans le contexte d'un module http,
Handler
peuvent ne pas être définisRequest
etResponse
sont définis (j'ai vu cela dans l'événement BeginRequest). Donc, si vous avez besoin d'une journalisation des demandes / réponses dans un module http personnalisé, ma réponse peut ne pas convenir.la source
C'est un cas très classique: si vous finissez par avoir à vérifier les données fournies par l'instance http, envisagez de déplacer ce code sous l'
BeginRequest
événement.Ceci est le bon endroit pour vérifier http têtes, chaîne de requête et etc ...
Application_Start
est pour les paramètres applicables pour l'ensemble des applications temps d'exécution, tels que le routage, les filtres, l' exploitation forestière et ainsi de suite.Veuillez ne pas appliquer de solutions de contournement telles que le .ctor statique ou le passage au mode classique à moins qu'il n'y ait aucun moyen de déplacer le code du
Start
versBeginRequest
. cela devrait être faisable pour la grande majorité de vos cas.la source
Puisqu'il n'y a plus de contexte de demande dans le pipeline lors du démarrage de l'application, je ne peux plus imaginer qu'il y ait un moyen de deviner sur quel serveur / port la prochaine demande réelle pourrait arriver. Vous devez le faire sur Begin_Session.
Voici ce que j'utilise lorsque je ne suis pas en mode classique. La surcharge est négligeable.
la source
Sur la base des besoins détaillés du PO expliqués dans les commentaires , une solution plus appropriée existe. L'OP déclare qu'il souhaite ajouter des données personnalisées dans ses logs avec log4net, données liées aux demandes.
Plutôt que d'encapsuler chaque appel log4net dans un appel de journal centralisé personnalisé qui gère la récupération des données liées aux requêtes (à chaque appel de journal), log4net propose des dictionnaires de contexte pour configurer des données supplémentaires personnalisées à journaliser. L'utilisation de ces dictionnaires permet de positionner vos données de journal de requêtes pour la requête en cours à l'événement BeginRequest, puis de les rejeter à l'événement EndRequest. Toute connexion entre les deux bénéficiera de ces données personnalisées.
Et les choses qui ne se produisent pas dans un contexte de demande n'essaieront pas de consigner les données liées à la demande, éliminant ainsi le besoin de tester la disponibilité de la demande. Cette solution correspond au principe proposé par Arman McHitaryan dans sa réponse .
Pour que cette solution fonctionne, vous aurez également besoin d'une configuration supplémentaire sur vos appenders log4net afin qu'ils puissent enregistrer vos données personnalisées.
Cette solution peut être facilement implémentée en tant que module d'amélioration de journal personnalisé. Voici un exemple de code pour cela:
Ajoutez-le à votre site, exemple de configuration IIS 7+:
Et configurez les appenders pour consigner ces propriétés supplémentaires, exemple de configuration:
la source
Vous pouvez contourner le problème sans passer en mode classique et toujours utiliser Application_Start
Pour une raison quelconque, le type statique est créé avec une requête dans son HTTPContext, vous permettant de le stocker et de le réutiliser immédiatement dans l'événement Application_Start
la source
J'ai pu contourner / pirater ce problème en passant en mode "Classique" à partir du mode "intégré".
la source
Cela a fonctionné pour moi - si vous devez vous connecter à Application_Start, faites-le avant de modifier le contexte. Vous obtiendrez une entrée de journal, juste sans source, comme:
2019-03-12 09: 35: 43,659 INFO (null) - Application démarrée
Je consigne généralement à la fois Application_Start et Session_Start, donc je vois plus de détails dans le message suivant
2019-03-12 09: 35: 45,064 INFO ~ / Leads / Leads.aspx - Session démarrée (Local)
la source
Dans Visual Studio 2012, lorsque j'ai publié la solution par erreur avec l'option «debug», j'ai obtenu cette exception. Avec l'option «release», cela ne s'est jamais produit. J'espère que ça aide.
la source
Vous pouvez utiliser les éléments suivants:
la source
faites ceci dans global.asax.cs:
fonctionne comme un charme. this.Context.Request est là ...
this.Request lève une exception intentionnellement basée sur un indicateur
la source