Untergeordnete Anforderungen generieren doppelte ASP.NET-Ereignisse in IIS
In diesem Artikel wird ein Entwurfsverhalten erläutert, das doppelte ASP.NET Ereignisse von untergeordneten Anforderungen während des Arbeitsprozesses im integrierten Pipelinemodus in Microsoft-Internetinformationsdienste (IIS) erstellt werden.
Ursprüngliche Produktversion: Internetinformationsdienste 7.0, 8.0, 8.5
Ursprüngliche KB-Nummer: 2901671
Problembeschreibung
Sie haben IIS 7.0 oder eine höhere Version von IIS für die Verwendung des integrierten Pipelinemodus konfiguriert. Einige HTTP-Module (HyperText Transfer Protocol) oder ISAPI-Anwendungen (Internet Server Application Program Interface) können jedoch doppelte ASP.NET Ereignisse auslösen, zBeginRequest. B. und EndRequest.
Situationen, in denen dieses Problem auftritt
Wenn ein Client eine bestimmte URL (Webseite) anfordert, fordert IIS manchmal die gleiche URL oder eine andere URL auf der Serverseite erneut an. Die ursprüngliche Anforderung des Clients wird als übergeordnete Anforderung bezeichnet, und die von IIS ausgeführte Anforderung wird als untergeordnete Anforderung bezeichnet.
Beispielsweise können beide der folgenden Elemente eine untergeordnete Anforderung ausführen:
- Eine ISAPI-Erweiterung, die die
HSE_REQ_EXEC_URL supportFunktion verwendet und als Platzhalterskriptzuordnung installiert ist. - Das systemeigene HTTP-Modul, das die Methode aufruft
IHttpContext::ExecuteRequest.
HSE_REQ_EXEC_URL ermöglicht einer ISAPI-Erweiterung, eine URL-Anforderung neu zu schreiben, um eine andere Erweiterung aufzurufen oder die ursprüngliche URL mithilfe der HSE_EXEC_URL_INFO Struktur aufzurufen. Wenn Sie die untergeordnete Anforderung aufrufen, legen Sie pszUrl des HSE_EXEC_URL_INFO Strukturmembers auf den URI-Stamm der untergeordneten URL fest. Wenn Sie die ursprüngliche URL aufrufen, legen Sie null festpszUrl. Zusätzlich zur HSE_REQ_EXEC_URL ISAPI-Erweiterung führt die IHttpContext::ExecuteRequest Methode die untergeordnete Anforderung aus, indem die IHttpContext Schnittstelle im pHttpContext Parameter angegeben wird.
Wenn sowohl die übergeordnete Anforderung als auch die untergeordnete Anforderung auf eine ASP.NET verbundene Anwendung abzielen, die im Arbeitsprozess des integrierten Pipelinemodus ausgeführt wird, können doppelte ASP.NET Ereignisse generiert werden. Sie können dieses Verhalten mithilfe von FREB (Failed Request Event Buffering) bestätigen. Dies wird auch als Fehlgeschlagene Anforderungsablaufverfolgung bezeichnet.
Protokolle
Der folgende Protokolleintrag zeigt Clientanforderungen an "/parent.aspx":
| Ereignis | Informationen |
|---|---|
| GENERAL_REQUEST_START | SiteId="1", AppPoolId="DefaultAppPool", ConnId="610612739", RawConnId="0", RequestURL=""http://localhost:80/parent.aspx, RequestVerb="GET" |
Der folgende Protokolleintrag zeigt, dass eine BEGIN_REQUEST Benachrichtigung in global.asax durch eine Anforderung an /parent.aspx ausgelöst wird. Dies ist die erste BEGIN_REQUEST Benachrichtigung:
| Ereignis | Informationen |
|---|---|
| NOTIFY_MODULE_START | ModuleName="global.asax", Notification="BEGIN_REQUEST", fIsPostNotification="false" |
| AspNetStart | Data1="GET", Data2="/parent.aspx", Data3="" |
Der folgende Protokolleintrag zeigt, dass das systemeigene HTTP-Modul (myhttpmodule.dll) ausgeführt wird und dass es die untergeordnete Anforderung child.aspx ausführt:
| Ereignis | Informationen |
|---|---|
| NOTIFY_MODULE_START | ModuleName="myhttpmodule", Notification="MAP_PATH", fIsPostNotification="false" |
| GENERAL_CHILD_REQUEST_START | SiteId="1", RequestURL=""http://localhost:80/child.aspx, RequestVerb="GET", RecursiveLevel="1" |
| GENERAL_REQUEST_START | SiteId="1", AppPoolId="DefaultAppPool", ConnId="1610612739", RawConnId="0", RequestURL="http://localhost:80/child.aspx", RequestVerb="GET" |
Der folgende Protokolleintrag zeigt, dass die BEGIN_REQUEST Benachrichtigung in global.asax durch eine Anforderung an /child.aspx ausgelöst wird. Dies ist die zweite BEGIN_REQUEST Benachrichtigung:
| Ereignis | Informationen |
|---|---|
| NOTIFY_MODULE_START | ModuleName="global.asax", Notification="BEGIN_REQUEST", fIsPostNotification="false" |
| AspNetStart | Data1="GET", Data2="/child.aspx", Data3="" |
Der folgende Protokolleintrag zeigt, dass die END_REQUEST Benachrichtigung in global.asax durch eine Anforderung an /child.aspx ausgelöst wird. Dies ist die erste END_REQUEST Benachrichtigung:
| Ereignis | Informationen |
|---|---|
| NOTIFY_MODULE_START | ModuleName="global.asax", Notification="END_REQUEST", fIsPostNotification="false" |
| AspNetPipelineEnter | Data1="ASP.global_asax" |
| AspNetPipelineLeave | Data1="ASP.global_asax" |
Der folgende Protokolleintrag zeigt, dass die untergeordnete Anforderung abgeschlossen ist:
| Ereignis | Informationen |
|---|---|
| GENERAL_REQUEST_END | BytesSent="332", BytesReceived="266", HttpStatus="200", HttpSubStatus="0" |
| GENERAL_CHILD_REQUEST_END | BytesSent="332", HttpStatus="200", HttpSubStatus="0" |
| NOTIFY_MODULE_COMPLETION | ModuleName="myhttpmodule", Notification="MAP_PATH", fIsPostNotificationEvent="false", CompletionBytes="0", ErrorCode="Der Vorgang wurde erfolgreich abgeschlossen. (0x0)" |
| AspNetEnd |
Der folgende Protokolleintrag zeigt, dass die END_REQUEST Benachrichtigung in global.asax durch eine Anforderung an /parent.aspx ausgelöst wird. Dies ist die zweite END_REQUEST Benachrichtigung:
| Ereignis | Informationen |
|---|---|
| NOTIFY_MODULE_START | ModuleName="global.asax", Notification="END_REQUEST", fIsPostNotification="false" |
| AspNetPipelineEnter | Data1="ASP.global_asax" |
| AspNetPipelineLeave | Data1="ASP.global_asax" |
Der folgende Protokolleintrag zeigt, dass die übergeordnete Anforderung abgeschlossen ist:
| Ereignis | Informationen |
|---|---|
| GENERAL_REQUEST_END | BytesSent="332", BytesReceived="266", HttpStatus="200", HttpSubStatus="0" |
References
Weitere Informationen zum Aufrufen der ExecuteRequest Methode zum Ausführen der untergeordneten Anforderung finden Sie unter IHttpContext::ExecuteRequest-Methode.
In diesem Beispielcode ist /default.aspxdie übergeordnete Anforderung , und die untergeordnete Anforderung ist /example/default.aspx.