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 pBuffer
enthält.
cbBuffer
Eine DWORD
, die die Größe des pBuffer
Puffers enthält, die größer oder gleich cbData
sein 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 pBuffer
zurückgegeben wurde, und der cbBuffer
Parameter muss die Größe des Anforderungsentitätspuffers in Bytes angeben, auf den von pBuffer
verwiesen wird.
Hinweis
cbBuffer
sollte immer größer oder gleich cbData
sein.
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein HTTP-Modul erstellen, das die folgenden Aufgaben ausführt:
Ordnet einen Puffer von 1 KB zu. Wenn der Puffer nicht zugeordnet werden kann, gibt das Modul einen Fehler zurück und wird beendet.
Erstellt eine Zeichenfolge, die einen Antwortwert enthält.
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