Ich verwende den integrierten IIS 7-Modus und erhalte
Anfrage ist in diesem Zusammenhang nicht verfügbar
wenn ich versuche, in einer Log4Net-bezogenen Funktion darauf zuzugreifen, von der aus aufgerufen wird Application_Start
. Dies ist die Codezeile, die ich habe
if (HttpContext.Current != null && HttpContext.Current.Request != null)
und eine Ausnahme wird für den zweiten Vergleich ausgelöst.
Was kann ich außer HttpContext.Current.Request auf null überprüfen?
Eine ähnliche Frage wird gestellt. @ Anfrage ist in diesem Kontext keine Ausnahme verfügbar, wenn mvc auf iis7.5 ausgeführt wird
aber auch dort keine relevante Antwort.
Antworten:
Bitte beachten Sie IIS7 integrierten Modus: Request ist in diesem Zusammenhang Ausnahme in Application_Start nicht verfügbar :
quelle
Wenn Sie über eine benutzerdefinierte Protokollierungslogik verfügen, ist es ziemlich ärgerlich, gezwungen zu sein, application_start entweder nicht zu protokollieren oder eine Ausnahme im Logger auftreten zu lassen (auch wenn dies behandelt wird).
Es scheint, dass Sie nicht die
Request
Verfügbarkeit testen , sondern die Verfügbarkeit testen könnenHandler
: Wenn dies nichtRequest
der Fall ist , wäre es seltsam, immer noch einen Anforderungshandler zu haben. Und das Testen aufHandler
löst diese gefürchteteRequest is not available in this context
Ausnahme nicht aus.Sie können Ihren Code also ändern in:
Beachten Sie, dass im Kontext eines http-Moduls
Handler
möglicherweise nicht definiertRequest
undResponse
definiert sind (ich habe dies im BeginRequest-Ereignis gesehen). Wenn Sie also eine Anforderungs- / Antwortprotokollierung in einem benutzerdefinierten http-Modul benötigen, ist meine Antwort möglicherweise nicht geeignet.quelle
Dies ist ein sehr klassischer Fall: Wenn Sie am Ende nach Daten suchen müssen, die von der http-Instanz bereitgestellt werden, sollten Sie diesen Code unter das
BeginRequest
Ereignis verschieben.Dies ist der richtige Ort, um nach http-Headern, Abfragezeichenfolgen usw. zu suchen. Hier finden Sie
Application_Start
die Einstellungen, die für die gesamte Laufzeit der Anwendung gelten, z. B. Routing, Filter, Protokollierung usw.Wenden Sie keine Problemumgehungen wie statischen .ctor an oder wechseln Sie in den klassischen Modus, es sei denn, Sie können den Code nicht von
Start
nach verschiebenBeginRequest
. Das sollte für die überwiegende Mehrheit Ihrer Fälle machbar sein.quelle
Da während des App-Starts kein Anforderungskontext mehr in der Pipeline ist, kann ich mir nicht vorstellen, auf welchen Server / Port die nächste tatsächliche Anforderung eingehen könnte. Sie müssen es also auf Begin_Session tun.
Folgendes verwende ich, wenn ich mich nicht im klassischen Modus befinde. Der Overhead ist vernachlässigbar.
quelle
Basierend auf den detaillierten Anforderungen des OP, die in den Kommentaren erläutert werden gibt es eine geeignetere Lösung. Das OP gibt an, dass er benutzerdefinierte Daten mit log4net in seine Protokolle aufnehmen möchte, Daten, die sich auf Anforderungen beziehen.
Anstatt jeden log4net-Aufruf in einen benutzerdefinierten zentralisierten Protokollaufruf zu verpacken, der das Abrufen anforderungsbezogener Daten (bei jedem Protokollaufruf) übernimmt, bietet log4net Kontextwörterbücher zum Einrichten benutzerdefinierter zusätzlicher Daten für die Protokollierung. Durch die Verwendung dieser Wörterbücher können Sie Ihre Anforderungsprotokolldaten für die aktuelle Anforderung beim BeginRequest-Ereignis positionieren und beim EndRequest-Ereignis schließen. Jede Anmeldung dazwischen profitiert von diesen benutzerdefinierten Daten.
Und Dinge, die in einem Anforderungskontext nicht passieren, versuchen nicht, anforderungsbezogene Daten zu protokollieren, sodass die Verfügbarkeit von Anforderungen nicht mehr getestet werden muss. Diese Lösung entspricht dem Prinzip, das Arman McHitaryan in seiner Antwort vorgeschlagen hat .
Damit diese Lösung funktioniert, benötigen Sie außerdem einige zusätzliche Konfigurationen für Ihre log4net-Appender, damit diese Ihre benutzerdefinierten Daten protokollieren können.
Diese Lösung kann einfach als benutzerdefiniertes Protokollverbesserungsmodul implementiert werden. Hier ist ein Beispielcode dafür:
Fügen Sie es Ihrer Site hinzu, IIS 7+ conf Beispiel:
Richten Sie Appender ein, um diese zusätzlichen Eigenschaften zu protokollieren. Beispielkonfiguration:
quelle
Sie können das Problem umgehen, ohne in den klassischen Modus zu wechseln, und trotzdem Application_Start verwenden
Aus irgendeinem Grund wird der statische Typ mit einer Anforderung in seinem HTTPContext erstellt, sodass Sie ihn speichern und sofort im Application_Start-Ereignis wiederverwenden können
quelle
Ich konnte dieses Problem umgehen / hacken, indem ich vom "integrierten" Modus in den "klassischen" Modus wechselte.
quelle
Dies hat bei mir funktioniert. Wenn Sie sich bei Application_Start anmelden müssen, tun Sie dies, bevor Sie den Kontext ändern. Sie erhalten einen Protokolleintrag, nur ohne Quelle, wie:
2019-03-12 09: 35: 43,659 INFO (null) - Anwendung gestartet
Im Allgemeinen protokolliere ich sowohl Application_Start als auch Session_Start, sodass ich in der nächsten Nachricht mehr Details sehe
2019-03-12 09: 35: 45,064 INFO ~ / Leads / Leads.aspx - Sitzung gestartet (lokal)
quelle
In Visual Studio 2012 habe ich diese Ausnahme erhalten, als ich die Lösung fälschlicherweise mit der Option 'Debug' veröffentlicht habe. Mit der Option 'Release' ist es nie aufgetreten. Ich hoffe es hilft.
quelle
Sie können Folgendes verwenden:
quelle
Tun Sie dies in global.asax.cs:
klappt wunderbar. this.Context.Request ist da ...
this.Request löst absichtlich eine Ausnahme aus, die auf einem Flag basiert
quelle