IHttpResponse::WriteEntityChunks メソッド
応答本文に 1 つ以上 のHTTP_DATA_CHUNK 構造体を追加します。
構文
virtual HRESULT WriteEntityChunks(
IN HTTP_DATA_CHUNK* pDataChunks,
IN DWORD nChunks,
IN BOOL fAsync,
IN BOOL fMoreData,
OUT DWORD* pcbSent,
OUT BOOL* pfCompletionExpected = NULL
) = 0;
パラメーター
pDataChunks
[IN]1 つ以上 HTTP_DATA_CHUNK
の構造体へのポインター。
nChunks
[IN] DWORD
によって pDataChunks
指されるチャンクの数を格納している 。
fAsync
[IN] true
メソッドが非同期的に完了する必要がある場合は 。それ以外の場合は false
。
fMoreData
[IN] true
応答でさらに多くのデータを送信する場合は 。 false
これが最後のデータである場合は 。
pcbSent
[OUT]呼び出しが同期的に完了した場合にクライアントに送信されたバイト数。
pfCompletionExpected
[OUT] true
この呼び出しで非同期完了が保留中の場合。それ以外の場合は false
。
戻り値
HRESULT
。 有効な値を次の表に示しますが、これ以外にもあります。
値 | 説明 |
---|---|
S_OK | 操作が成功したことを示します。 |
ERROR_INVALID_PARAMETER | パラメーターが無効であることを示します (たとえば、ポインターが pDataChunks NULL に設定されています)。 |
ERROR_NOT_ENOUGH_MEMORY | 操作を実行するためのメモリが不足していることを示します。 |
ERROR_ARITHMETIC_OVERFLOW | 応答に 65535 個を超えるチャンクが追加されました。 |
解説
開発者は、 メソッドを WriteEntityChunks
使用して、単一 HTTP_DATA_CHUNK
の構造体または構造体の HTTP_DATA_CHUNK
配列を応答本文に挿入できます。 操作が同期的に完了した場合、 pcbSent
パラメーターは応答に挿入されたバイト数を受け取ります。
バッファー処理が有効になっている場合、 WriteEntityChunks
メソッドは構造体 HTTP_DATA_CHUNK
のコピーを作成し、基になるデータを複製して保持する必要がないようにします。 バッファリングがオフになっている場合、または応答バッファーの制限に達した場合、 WriteEntityChunks
メソッドも応答をフラッシュします。 バッファー処理がオフで fAsync
、 パラメーターが の場合、 true
要求が完了するまでメモリを保持する必要があります。
パラメーターを WriteEntityChunks
に設定することで、非同期的に完了するように操作をfAsync
true
構成できます。 この場合、 WriteEntityChunks
メソッドは呼び出し元に直ちに戻り pcbSent
、パラメーターは応答に挿入されたバイト数を受け取りません。 バッファー処理が無効で、 fAsync
パラメーターが の場合、 true
非同期呼び出しが pDataChunks
完了するまで、パラメーターのメモリを永続化する必要があります。
要求には、最大 65535 チャンク (64 KB から 1 を引いた値) を書き込むことができます。
例
次の例では、 メソッドを使用 WriteEntityChunks
して、2 つのデータ チャンクの配列を応答に挿入する HTTP モジュールを作成する方法を示します。 次に、Web クライアントに応答を返します。
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class MyHttpModule : 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;
// Create an array of data chunks.
HTTP_DATA_CHUNK dataChunk[2];
// Buffer for bytes written of data chunk.
DWORD cbSent;
// Create string buffers.
PCSTR pszOne = "First chunk data\n";
PCSTR pszTwo = "Second chunk data\n";
// 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);
// Set the chunk to a chunk in memory.
dataChunk[0].DataChunkType = HttpDataChunkFromMemory;
// Set the chunk to the first buffer.
dataChunk[0].FromMemory.pBuffer =
(PVOID) pszOne;
// Set the chunk size to the first buffer size.
dataChunk[0].FromMemory.BufferLength =
(USHORT) strlen(pszOne);
// Set the chunk to a chunk in memory.
dataChunk[1].DataChunkType = HttpDataChunkFromMemory;
// Set the chunk to the second buffer.
dataChunk[1].FromMemory.pBuffer =
(PVOID) pszTwo;
// Set the chunk size to the second buffer size.
dataChunk[1].FromMemory.BufferLength =
(USHORT) strlen(pszTwo);
// Insert the data chunks into the response.
hr = pHttpResponse->WriteEntityChunks(
dataChunk,2,FALSE,TRUE,&cbSent);
// Test for an error.
if (FAILED(hr))
{
// Set the error status.
pProvider->SetErrorStatus( 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 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_BEGIN_REQUEST,
0
);
}
モジュールで RegisterModule 関数をエクスポートする必要があります。 この関数をエクスポートするには、プロジェクトのモジュール定義 (.def) ファイルを作成するか、 スイッチを使用してモジュールを /EXPORT:RegisterModule
コンパイルします。 詳細については、「 チュートリアル: ネイティブ コードを使用したRequest-Level HTTP モジュールの作成」を参照してください。
必要に応じて、各関数の呼び出し規約を __stdcall (/Gz)
明示的に宣言するのではなく、呼び出し規約を使用してコードをコンパイルできます。
要件
Type | 説明 |
---|---|
Client | - Windows Vista 上の IIS 7.0 - Windows 7 上の IIS 7.5 - Windows 8 上の IIS 8.0 - Windows 10の IIS 10.0 |
サーバー | - Windows Server 2008 の IIS 7.0 - Windows Server 2008 R2 の IIS 7.5 - Windows Server 2012 の IIS 8.0 - Windows Server 2012 R2 の IIS 8.5 - Windows Server 2016の IIS 10.0 |
製品 | - 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 |
参照
IHttpResponse インターフェイス
IHttpResponse::WriteEntityChunkByReference メソッド