Freigeben über


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; falseandernfalls . (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 dwExecuteFlagsangeben. 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 pHttpUserangeben, 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:

  1. Das Modul registriert sich für die RQ_MAP_PATH Benachrichtigung.

  2. Das Modul erstellt eine CHttpModule-Klasse , die die Methoden OnMapPath und OnAsyncCompletion enthält.

  3. Wenn ein Webclient eine URL anfordert, ruft IIS die -Methode des Moduls auf OnMapPath . Diese Methode führt die folgenden Tasks aus:

    1. 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.

    2. Ruft die Methode des Klons IHttpRequest::SetUrl auf, um die URL für den Klon auf /example/default.aspx festzulegen.

    3. Ruft die ExecuteRequest -Methode auf, um die untergeordnete Anforderung auszuführen.

    4. 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.

  4. Wenn eine asynchrone Vervollständigung erforderlich ist, ruft IIS die Methode des Moduls auf OnAsyncCompletion . Diese Methode gibt den geklonten Kontext frei.

  5. 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