Używam trybu zintegrowanego usług IIS 7 i otrzymuję
Żądanie nie jest dostępne w tym kontekście
kiedy próbuję uzyskać do niego dostęp w funkcji związanej z Log4Net, która jest wywoływana z Application_Start
. To jest linia kodu, którą mam
if (HttpContext.Current != null && HttpContext.Current.Request != null)
i dla drugiego porównania jest zgłaszany wyjątek.
Co jeszcze mogę sprawdzić poza sprawdzaniem HttpContext.Current.Request dla null?
Pojawia się podobne pytanie @ Żądanie nie jest dostępne w tym kontekście wyjątek, gdy uruchamiany jest mvc na iis7.5
ale tam też nie ma odpowiedniej odpowiedzi.
Odpowiedzi:
Zobacz tryb zintegrowany usług IIS7: żądanie nie jest dostępne w tym kontekście wyjątek w Application_Start :
źródło
Gdy masz niestandardową logikę rejestrowania, dość denerwujące jest zmuszanie do nierejestrowania application_start lub konieczności zezwolenia na wystąpienie wyjątku w rejestratorze (nawet jeśli jest obsługiwany).
Wygląda na to, że zamiast testować
Request
dostępność, możesz przetestowaćHandler
dostępność: jeśli nie maRequest
, byłoby dziwne, gdyby nadal mieć moduł obsługi żądań. A testowanie pod kątemHandler
nie powoduje tego przerażającegoRequest is not available in this context
wyjątku.Możesz więc zmienić swój kod na:
Uważaj, w kontekście modułu http
Handler
mogą nie być zdefiniowaneRequest
iResponse
są zdefiniowane (widziałem to w zdarzeniu BeginRequest). Więc jeśli potrzebujesz logowania żądania / odpowiedzi w niestandardowym module http, moja odpowiedź może nie być odpowiednia.źródło
To bardzo klasyczny przypadek: jeśli w końcu będziesz musiał sprawdzić jakiekolwiek dane dostarczone przez instancję http, rozważ przeniesienie tego kodu pod
BeginRequest
zdarzenie.To jest właściwe miejsce do sprawdzania nagłówków http, ciągów zapytań itp., Dotyczy
Application_Start
ustawień, które dotyczą całej aplikacji, takich jak routing, filtry, logowanie i tak dalej.Nie stosuj żadnych obejść, takich jak statyczny .ctor lub przełączanie do trybu klasycznego, chyba że nie ma możliwości przeniesienia kodu z
Start
doBeginRequest
. powinno to być możliwe w większości przypadków.źródło
Ponieważ nie ma już kontekstu żądania w potoku podczas uruchamiania aplikacji, nie wyobrażam sobie, aby zgadnąć, na jakim serwerze / porcie może przyjść następne rzeczywiste żądanie. Musisz to zrobić na Begin_Session.
Oto, czego używam, gdy nie jestem w trybie klasycznym. Narzut jest znikomy.
źródło
W oparciu o szczegółowe potrzeby PO wyjaśnione w komentarzach istnieje bardziej odpowiednie rozwiązanie. OP oświadcza, że chce dodać niestandardowe dane w swoich dziennikach za pomocą log4net, dane związane z żądaniami.
Zamiast zawijać każde wywołanie log4net w niestandardowy scentralizowany dziennik, który obsługuje pobieranie danych związanych z żądaniem (przy każdym wywołaniu dziennika), log4net zawiera słowniki kontekstowe do konfigurowania niestandardowych dodatkowych danych do logowania. Korzystanie z tych słowników pozwala na umieszczenie danych dziennika żądań dla bieżącego żądania w zdarzeniu BeginRequest, a następnie odrzucenie go w zdarzeniu EndRequest. Każde logowanie pomiędzy będzie korzystało z tych niestandardowych danych.
A rzeczy, które nie zdarzają się w kontekście żądania, nie będą próbować rejestrować danych związanych z żądaniem, eliminując potrzebę testowania dostępności żądania. To rozwiązanie jest zgodne z zasadą, którą sugerował Arman McHitaryan w swojej odpowiedzi .
Aby to rozwiązanie działało, będziesz potrzebować dodatkowej konfiguracji w aplikatorach log4net, aby mogli rejestrować niestandardowe dane.
To rozwiązanie można łatwo wdrożyć jako niestandardowy moduł rozszerzający dziennik. Oto przykładowy kod:
Dodaj to do swojej witryny, przykład konfiguracji IIS 7+:
Skonfiguruj programy dołączające, aby rejestrowały te dodatkowe właściwości, przykładowa konfiguracja:
źródło
Możesz obejść ten problem bez przełączania się do trybu klasycznego i nadal używać Application_Start
Z jakiegoś powodu typ statyczny jest tworzony z żądaniem w jego kontekście HTTPContext, co pozwala na jego przechowywanie i natychmiastowe ponowne użycie w zdarzeniu Application_Start
źródło
Udało mi się obejść / zhakować ten problem, przechodząc do trybu „Klasycznego” z trybu „zintegrowanego”.
źródło
U mnie to zadziałało - jeśli musisz zalogować się do Application_Start, zrób to przed zmodyfikowaniem kontekstu. Otrzymasz wpis dziennika, tylko bez źródła, taki jak:
2019-03-12 09: 35: 43,659 INFO (null) - Uruchomiono aplikację
Generalnie rejestruję zarówno Application_Start, jak i Session_Start, więc więcej szczegółów zobaczę w następnej wiadomości
2019-03-12 09: 35: 45,064 INFO ~ / Leads / Leads.aspx - Sesja rozpoczęta (lokalnie)
źródło
W Visual Studio 2012, kiedy błędnie opublikowałem rozwiązanie z opcją „debug”, dostałem ten wyjątek. Z opcją „zwolnij” to się nigdy nie zdarzyło. Mam nadzieję, że to pomoże.
źródło
Możesz użyć następujących:
źródło
zrób to w global.asax.cs:
działa jak marzenie. this.Context.Request jest tam ...
this.Request celowo zgłasza wyjątek na podstawie flagi
źródło