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 support Funktion 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.