Freigeben über


IHttpContext::ReleaseClonedContext-Methode

Gibt eine geklonte IHttpContext-instance frei.

Syntax

virtual HRESULT ReleaseClonedContext(  
   VOID  
) = 0;  

Parameter

Diese Methode nimmt zwei Parameter entgegen.

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_INVALID_PARAMETER Gibt an, dass der übergeordnete Kontext für die aktuelle Anforderung ungültig ist (z. B. wird ein untergeordneter Kontext freigegeben, nachdem das übergeordnete Element freigegeben wurde).

Bemerkungen

Die ReleaseClonedContext -Methode gibt eine instance einer IHttpContext Schnittstelle frei. Wenn Sie beispielsweise einen untergeordneten Kontext mithilfe der IHttpContext::CloneContext-Methode erstellen, würden Sie die -Methode des ReleaseClonedContext untergeordneten Elements aufrufen, um den untergeordneten Kontext freizugeben, wenn Sie die Verwendung abgeschlossen haben.

Wichtig

Wenn Sie die ReleaseClonedContext -Methode aufrufen, um eine untergeordnete Anforderung nach dem Freigeben des übergeordneten Kontexts freizugeben, wird ERROR_INVALID_PARAMETER zurückgegeben. Wenn Sie beispielsweise einen untergeordneten Kontext erstellen und dann dieses untergeordnete Element verwenden, um eine geschachtelte untergeordnete Anforderung zu erstellen, müssen Sie die untergeordneten Kontexte in umgekehrter Reihenfolge ihrer Erstellung freigeben.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie ein HTTP-Modul erstellt wird, das die folgenden Aufgaben ausführt:

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

  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 OnMapPath auf. Diese Methode führt die folgenden Tasks aus:

    1. Testet, ob die URL für die aktuelle Anforderung einen nachgestellten Schrägstrich aufweist oder mit /default.aspx endet. Wenn die URL mit einem element endet, 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 IHttpContext::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 OnAsyncCompletion auf. Diese Methode gibt den geklonten Kontext frei.

  5. Das Modul entfernt die CHttpModule -Klasse aus dem Arbeitsspeicher und beendet dann.

#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 RegisterModule-Funktion 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 Schalters /EXPORT:RegisterModule 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) Aufrufkonvention verwenden, anstatt die Aufrufkonvention 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 unter 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 unter 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::ExecuteRequest-Methode