IHttpContext::ExecuteRequest-Methode
Führt eine untergeordnete Anforderung aus.
Syntax
virtual HRESULT ExecuteRequest(
IN BOOL fAsync,
IN IHttpContext* pHttpContext,
IN DWORD dwExecuteFlags,
IN IHttpUser* pHttpUser,
OUT BOOL* pfCompletionExpected = NULL
) = 0;
Parameter
fAsync
[IN] Always true
(gibt die asynchrone Ausführung an).
pHttpContext
[IN] Ein Zeiger auf den auszuführenden untergeordneten IHttpContext .
dwExecuteFlags
[IN] Eine DWORD
, die die Anforderungsausführungsflags enthält.
pHttpUser
[IN] Ein Zeiger auf einen IHttpUser für die Anforderung. (Optional)
pfCompletionExpected
[OUT] true
, wenn die asynchrone Vervollständigung noch aussteht; false
andernfalls . (Optional)
Rückgabewert
HRESULT
. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.
Wert | BESCHREIBUNG |
---|---|
S_OK | Gibt an, dass der Vorgang erfolgreich war. |
ERROR_NOT_SUPPORTED | Gibt an, dass die Anforderung nicht unterstützt wird (z. B. auf festgelegt false ist oder fAsync die untergeordnete Anforderung nicht aus der übergeordneten Anforderung geklont wurde). |
ERROR_STACK_OVERFLOW | Gibt an, dass die Anforderung den Grenzwert für rekursive untergeordnete Anforderungen überschreitet. |
Bemerkungen
Die ExecuteRequest
-Methode führt die untergeordnete Anforderung aus, die von der IHttpContext-Schnittstelle im pHttpContext
Parameter angegeben wird. Sie müssen diesen Anforderungskontext mithilfe der IHttpContext::CloneContext-Methode erstellen.
Wichtig
Beim Versuch, eine untergeordnete Anforderung auszuführen, die nicht von der übergeordneten Anforderung geklont wurde, wird ERROR_NOT_SUPPORTED zurückgegeben.
Jeder untergeordnete Kontext kann nur einmal ausgeführt werden, obwohl untergeordnete Anforderungen rekursiv geschachtelt werden können.
Hinweis
Der Grenzwert für rekursive untergeordnete Anforderungen beträgt 10.
Die ExecuteRequest
Methode unterstützt nur asynchrone Vorgänge, wodurch verhindert wird, dass der Threadpool erschöpft wird.
Wichtig
Beim Versuch, eine synchrone untergeordnete Anforderung auszuführen, wird ERROR_NOT_SUPPORTED zurückgegeben.
Sie können das Ausführungsverhalten für die untergeordnete Anforderung steuern, indem Sie Ausführungsflags in dwExecuteFlags
angeben. In der folgenden Tabelle sind die möglichen Werte für diese Flags aufgeführt.
Wert | BESCHREIBUNG |
---|---|
EXECUTE_FLAG_NO_HEADERS | Unterdrücken Sie die HTTP-Header für die untergeordnete Anforderung. |
EXECUTE_FLAG_IGNORE_CURRENT_INTERCEPTOR | Ignorieren Sie den aktuellen Skriptzuordnungshandler für diese Anforderungskette. |
EXECUTE_FLAG_IGNORE_APPPOOL | Führen Sie die Anforderung auch dann aus, wenn sich die untergeordnete Anforderung nicht im selben Anwendungspool befindet. |
EXECUTE_FLAG_DISABLE_CUSTOM_ERROR | Deaktivieren Sie benutzerdefinierte Fehler für die untergeordnete Anforderung. |
EXECUTE_FLAG_SAME_URL | Die URL für die untergeordnete Anforderung ist identisch mit der übergeordneten Anforderung. Hinweis: Skriptzuordnungshandler verwenden dieses Flag, um die Ausführung weiterzuleiten. |
EXECUTE_FLAG_BUFFER_RESPONSE | Leeren Sie die untergeordnete Antwort nicht. gibt die Antwort auf die übergeordnete Anforderung zurück. |
EXECUTE_FLAG_HTTP_CACHE_ELIGIBLE | Die untergeordnete Antwort ist weiterhin für die Zwischenspeicherung durch Http.sys berechtigt. Hinweis: Die Zwischenspeicherung ist standardmäßig deaktiviert, wenn eine untergeordnete Anforderung ausgeführt wird. |
Wenn Sie eine IHttpUser
Schnittstelle für pHttpUser
angeben, wird die Authentifizierung für die untergeordnete Anforderung übersprungen.
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein HTTP-Modul erstellen, das die folgenden Aufgaben ausführt:
Das Modul registriert sich für die RQ_MAP_PATH Benachrichtigung.
Das Modul erstellt eine CHttpModule-Klasse , die die Methoden OnMapPath und OnAsyncCompletion enthält.
Wenn ein Webclient eine URL anfordert, ruft IIS die -Methode des Moduls auf
OnMapPath
. Diese Methode führt die folgenden Tasks aus:Testet, ob die URL für die aktuelle Anforderung mit zwei bestimmten URLs im Stammverzeichnis der Website übereinstimmt. Wenn die URL mit einer der angegebenen URLs übereinstimmt, verwendet das Modul die
IHttpContext::CloneContext
-Methode, um einen Klon der aktuellen Anforderung zu erstellen.Ruft die Methode des Klons
IHttpRequest::SetUrl
auf, um die URL für den Klon auf /example/default.aspx festzulegen.Ruft die
ExecuteRequest
-Methode auf, um die untergeordnete Anforderung auszuführen.Tests auf asynchrone Vervollständigung. Wenn die asynchrone Vervollständigung aussteht, gibt das Modul die Verarbeitung an die integrierte Anforderungsverarbeitungspipeline zurück. Andernfalls gibt das Modul den geklonten Kontext frei.
Wenn eine asynchrone Vervollständigung erforderlich ist, ruft IIS die Methode des Moduls auf
OnAsyncCompletion
. Diese Methode gibt den geklonten Kontext frei.Das Modul entfernt die
CHttpModule
-Klasse aus dem Arbeitsspeicher und wird dann beendet.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class MyHttpModule : public CHttpModule
{
private:
// Create a pointer for a child request.
IHttpContext * m_pChildRequestContext;
public:
MyHttpModule(void)
{
m_pChildRequestContext = NULL;
}
REQUEST_NOTIFICATION_STATUS
OnMapPath(
IN IHttpContext * pHttpContext,
IN IMapPathProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
HRESULT hr;
BOOL fCompletionExpected;
// Retrieve a pointer to the URL.
PCWSTR pwszUrl = pProvider->GetUrl();
// Only process requests for the root.
if (0 == wcscmp(pwszUrl,L"/") || 0 == wcscmp(pwszUrl,L"/default.aspx"))
{
// Clone the current context.
hr = pHttpContext->CloneContext(
CLONE_FLAG_BASICS, &m_pChildRequestContext );
// Test for a failure.
if (FAILED(hr))
{
goto Failure;
}
// Test for an error.
if ( NULL != m_pChildRequestContext )
{
// Set the URL for the child request.
hr = m_pChildRequestContext->GetRequest()->SetUrl(
"/example/default.aspx",
(DWORD)strlen("/example/default.aspx"),false);
// Test for a failure.
if (FAILED(hr))
{
goto Failure;
}
// Execute the child request.
hr = pHttpContext->ExecuteRequest(
TRUE, m_pChildRequestContext,
0, NULL, &fCompletionExpected );
// Test for a failure.
if (FAILED(hr))
{
goto Failure;
}
// Test for pending asynchronous operations.
if (fCompletionExpected)
{
return RQ_NOTIFICATION_PENDING;
}
}
Failure:
// Test for a child request.
if (NULL != m_pChildRequestContext)
{
// Release the child request.
m_pChildRequestContext->ReleaseClonedContext();
m_pChildRequestContext = NULL;
}
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnAsyncCompletion(
IN IHttpContext * pHttpContext,
IN DWORD dwNotification,
IN BOOL fPostNotification,
IN IHttpEventProvider * pProvider,
IN IHttpCompletionInfo * pCompletionInfo
)
{
// Test for a child request.
if (NULL != m_pChildRequestContext)
{
// Release the child request.
m_pChildRequestContext->ReleaseClonedContext();
m_pChildRequestContext = NULL;
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
};
// Create the module's class factory.
class MyHttpModuleFactory : public IHttpModuleFactory
{
public:
HRESULT
GetHttpModule(
OUT CHttpModule ** ppModule,
IN IModuleAllocator * pAllocator
)
{
UNREFERENCED_PARAMETER( pAllocator );
// Create a new instance.
MyHttpModule * pModule = new MyHttpModule;
// Test for an error.
if (!pModule)
{
// Return an error if we cannot create the instance.
return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
else
{
// Return a pointer to the module.
*ppModule = pModule;
pModule = NULL;
// Return a success status.
return S_OK;
}
}
void Terminate()
{
// Remove the class from memory.
delete this;
}
};
// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo * pModuleInfo,
IHttpServer * pGlobalInfo
)
{
UNREFERENCED_PARAMETER( dwServerVersion );
UNREFERENCED_PARAMETER( pGlobalInfo );
return pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_MAP_PATH,
0
);
}
Ihr Modul muss die Funktion RegisterModule exportieren. Sie können diese Funktion exportieren, indem Sie eine Moduldefinitionsdatei (.def) für Ihr Projekt erstellen, oder Sie können das Modul mithilfe des /EXPORT:RegisterModule
Switches kompilieren. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Erstellen eines Request-Level HTTP-Moduls mithilfe von nativem Code.
Sie können den Code optional kompilieren, indem Sie die __stdcall (/Gz)
aufrufende Konvention verwenden, anstatt die aufrufende Konvention für jede Funktion explizit zu deklarieren.
Anforderungen
type | BESCHREIBUNG |
---|---|
Client | – IIS 7.0 unter Windows Vista – IIS 7.5 unter Windows 7 – IIS 8.0 unter Windows 8 – IIS 10.0 auf Windows 10 |
Server | – IIS 7.0 unter Windows Server 2008 – IIS 7.5 unter Windows Server 2008 R2 – IIS 8.0 unter Windows Server 2012 – IIS 8.5 unter Windows Server 2012 R2 – IIS 10.0 auf Windows Server 2016 |
Produkt | – IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0 - IIS Express 7.5, IIS Express 8.0, IIS Express 10.0 |
Header | Httpserv.h |
Weitere Informationen
IHttpContext-Schnittstelle
IHttpContext::CloneContext-Methode
IHttpContext::GetParentContext-Methode
IHttpContext::ReleaseClonedContext-Methode