Freigeben über


IReadEntityProvider::SetEntity-Methode

Gibt die Anforderungsentität an.

Syntax

virtual VOID SetEntity(  
   PVOID pBuffer,  
   DWORD cbData,  
   DWORD cbBuffer  
) = 0;  

Parameter

pBuffer
Ein Zeiger auf einen void-Puffer, der die Anforderungsentität enthält.

cbData
Eine DWORD , die die Größe der Daten in pBufferenthält.

cbBuffer
Eine DWORD , die die Größe des pBuffer Puffers enthält, die größer oder gleich cbDatasein sollte.

Rückgabewert

VOID.

Bemerkungen

Die SetEntity -Methode ersetzt den vorab geladenen HTTP-Anforderungsentitätstext durch den Entitätstext, auf den der pBuffer Parameter verweist. Der cbData Parameter muss die Größe (in Bytes) der Daten in der Anforderungsentität angeben, die in pBufferzurückgegeben wurde, und der cbBuffer Parameter muss die Größe des Anforderungsentitätspuffers in Bytes angeben, auf den von pBufferverwiesen wird.

Hinweis

cbBuffer sollte immer größer oder gleich cbDatasein.

Beispiel

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

  1. Ordnet einen Puffer von 1 KB zu. Wenn der Puffer nicht zugeordnet werden kann, gibt das Modul einen Fehler zurück und wird beendet.

  2. Erstellt eine Zeichenfolge, die einen Antwortwert enthält.

  3. Gibt die Anforderungsentität mithilfe der SetEntity -Methode an, und wird dann beendet.

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

// NOTE - Data needs to be passed to this module, e.g. a POST request, or it will not appear to return anything.

// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS
    OnReadEntity(
        IN IHttpContext * pHttpContext,
        IN IReadEntityProvider * pProvider
    )
    {
        // Allocate a 1K buffer for the request entity.
        DWORD cbBuffer = 1024;
        void * pvBuffer = pHttpContext->AllocateRequestMemory(cbBuffer);
        
        // Test for an error.
        if (NULL == pvBuffer)
        {
            // Set the error status.
            pProvider->SetErrorStatus(
                HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY));
            // End additional processing.
            return RQ_NOTIFICATION_FINISH_REQUEST;
        }

        // Create a string to return.
        char szBuffer[] = "Name=Value";
        // Specify the exact data length.
        DWORD cbData = (DWORD) strlen(szBuffer);        
        // Copy a string into the request entity buffer.
        strcpy_s((char*)pvBuffer,cbBuffer,szBuffer);
        // Set the request entity to the buffer.
        pProvider->SetEntity(pvBuffer,cbData,cbBuffer);

        // 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 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 MyHttpModuleFactory,
        RQ_READ_ENTITY,
        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

IReadEntityProvider-Schnittstelle
IReadEntityProvider::GetEntity-Methode
IHttpRequest::ReadEntityBody-Methode
IHttpRequest::InsertEntityBody-Methode