Condividi tramite


Metodo IHttpModuleFactory::GetHttpModule

Crea un'istanza di una classe CHttpModule .

Sintassi

virtual HRESULT GetHttpModule(  
   OUT CHttpModule** ppModule,  
   IN IModuleAllocator* pAllocator  
) = 0;  

Parametri

ppModule
[OUT] Puntatore dereferenced a una classe CHttpModule .

pAllocator
[IN] Puntatore a un'interfaccia IModuleAllocator .

Valore restituito

Oggetto HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.

Valore Descrizione
S_OK Indica che l'operazione ha avuto esito positivo.

Nota

Poiché la factory del modulo è necessaria per fornire un GetHttpModule metodo, è possibile specificare qualsiasi codice di stato per il valore restituito come appropriato per l'applicazione. Almeno, il GetHttpModule metodo deve restituire S_OK per indicare un completamento riuscito.

Commenti

Un'interfaccia IHttpModuleFactory deve fornire un metodo che crea un'istanza GetHttpModule della CHttpModule classe. Quando IIS chiama la funzione RegisterModule esportata del modulo, IIS userà il metodo di GetHttpModule Module Factory per creare un'istanza della CHttpModule classe.

Esempio

Nell'esempio di codice seguente viene illustrato come creare un semplice modulo HTTP "Hello World". Il modulo definisce una funzione esportata RegisterModule che passa un'istanza di un'interfaccia IHttpModuleFactory al metodo IHttpModuleRegistrationInfo::SetRequestNotifications e registra per la notifica di RQ_BEGIN_REQUEST . IIS usa il metodo per creare un'istanza GetHttpModule di una CHttpModule classe e restituisce uno stato di esito positivo. IIS usa anche il metodo Terminate dell'interfaccia IHttpModuleFactory per rimuovere la factory dalla memoria.

Quando viene attivata una RQ_BEGIN_REQUEST notifica, IIS chiama il metodo CHttpModule::OnBeginRequest del modulo per elaborare la richiesta corrente. OnBeginRequest cancella il buffer di risposta e modifica il tipo MIME per la risposta. Il metodo crea quindi un blocco di dati che contiene una stringa "Hello World" e restituisce la stringa a un client Web. Infine, il modulo restituisce un indicatore di stato che notifica a IIS che tutte le notifiche vengono completate e quindi terminano.

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// Create the module class.
class CHelloWorld : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS
    OnBeginRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pProvider );

        // Create an HRESULT to receive return values from methods.
        HRESULT hr;
        
        // Retrieve a pointer to the response.
        IHttpResponse * pHttpResponse = pHttpContext->GetResponse();

        // Test for an error.
        if (pHttpResponse != NULL)
        {
            // Clear the existing response.
            pHttpResponse->Clear();
            // Set the MIME type to plain text.
            pHttpResponse->SetHeader(
                HttpHeaderContentType,"text/plain",
                (USHORT)strlen("text/plain"),TRUE);

            // Create a string with the response.
            PCSTR pszBuffer = "Hello World!";
            // Create a data chunk.
            HTTP_DATA_CHUNK dataChunk;
            // Set the chunk to a chunk in memory.
            dataChunk.DataChunkType = HttpDataChunkFromMemory;
            // Buffer for bytes written of data chunk.
            DWORD cbSent;
            
            // Set the chunk to the buffer.
            dataChunk.FromMemory.pBuffer =
                (PVOID) pszBuffer;
            // Set the chunk size to the buffer size.
            dataChunk.FromMemory.BufferLength =
                (USHORT) strlen(pszBuffer);
            // Insert the data chunk into the response.
            hr = pHttpResponse->WriteEntityChunks(
                &dataChunk,1,FALSE,TRUE,&cbSent);

            // Test for an error.
            if (FAILED(hr))
            {
                // Set the HTTP status.
                pHttpResponse->SetStatus(500,"Server Error",0,hr);
            }

            // End additional processing.
            return RQ_NOTIFICATION_FINISH_REQUEST;
        }

        // Return processing to the pipeline.
        return RQ_NOTIFICATION_CONTINUE;
    }
};

// Create the module's class factory.
class CHelloWorldFactory : public IHttpModuleFactory
{
public:
    HRESULT
    GetHttpModule(
        OUT CHttpModule ** ppModule, 
        IN IModuleAllocator * pAllocator
    )
    {
        UNREFERENCED_PARAMETER( pAllocator );

        // Create a new instance.
        CHelloWorld * pModule = new CHelloWorld;

        // Test for an error.
        if (!pModule)
        {
            // Return an error if the factory 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 );

    // Set the request notifications and exit.
    return pModuleInfo->SetRequestNotifications(
        new CHelloWorldFactory,
        RQ_BEGIN_REQUEST,
        0
    );
}

Il modulo deve esportare la RegisterModule funzione. È possibile esportare questa funzione creando un file di definizione del modulo (con estensione def) per il progetto oppure è possibile compilare il modulo usando l'opzione /EXPORT:RegisterModule . Per altre informazioni, vedere Procedura dettagliata: Creazione di un modulo HTTP Request-Level tramite codice nativo.

Facoltativamente, è possibile compilare il codice usando la __stdcall (/Gz) convenzione chiamante anziché dichiarare esplicitamente la convenzione chiamante per ogni funzione.

Requisiti

Tipo Descrizione
Client - IIS 7.0 in Windows Vista
- IIS 7.5 in Windows 7
- IIS 8.0 in Windows 8
- IIS 10.0 in Windows 10
Server - IIS 7.0 in Windows Server 2008
- IIS 7.5 in Windows Server 2008 R2
- IIS 8.0 in Windows Server 2012
- IIS 8.5 in Windows Server 2012 R2
- IIS 10.0 in Windows Server 2016
Prodotto - 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
Intestazione Httpserv.h

Vedere anche

Classe CHttpModule
Interfaccia IHttpModuleFactory
Progettazione di moduli HTTP Native-Code
Procedura dettagliata: Creazione di un modulo HTTP Request-Level tramite codice nativo