IHttpResponse::WriteEntityChunkByReference-Methode
Fügt eine HTTP_DATA_CHUNK-Struktur in den Antworttext ein oder fügt sie an.
Syntax
HRESULT WriteEntityChunkByReference(
IN HTTP_DATA_CHUNK* pDataChunk,
IN LONG lInsertPosition = -1
)
Parameter
pDataChunk
[IN] Ein Zeiger auf eine HTTP_DATA_CHUNK
Struktur.
lInsertPosition
[IN] Ein LONG
Wert, der angibt, ob der Block eingefügt oder angefügt werden soll.
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 Parameter ungültig ist (z. B. ist der HTTP_DATA_CHUNK Zeiger auf NULL festgelegt). |
ERROR_NOT_ENOUGH_MEMORY | Gibt an, dass nicht genügend Arbeitsspeicher zum Ausführen des Vorgangs vorhanden ist. |
ERROR_ARITHMETIC_OVERFLOW | Gibt an, dass der Antwort mehr als 65535 Blöcke hinzugefügt wurden. |
Bemerkungen
Die WriteEntityChunkByReference
-Methode fügt eine HTTP_DATA_CHUNK
Struktur in den Antwortpuffer ein oder fügt sie in Abhängigkeit vom Wert des lInsertPosition
Parameters an.
Wenn
lInsertPosition
0 ist, werden die Daten vor den vorhandenen Antwortdaten eingefügt.Wenn
lInsertPosition
-1 ist, werden die Daten nach dem letzten Teil der vorhandenen Antwortdaten angefügt.Die
WriteEntityChunkByReference
-Methode fügt einen Verweis auf den ursprünglichen Datenblock anstelle einer Kopie in den Antwortpuffer ein. Daher muss der fürpDataChunk->FromMemory.pBuffer
zugewiesene Arbeitsspeicher für die Dauer der Antwortverarbeitung beibehalten werden. Die Verwendung des lokalen Speichers oder des Stapelspeichers führt zu einem nicht definierten Verhalten.Maximal 65535 (64 KB minus 1) Blöcke können in eine Anforderung geschrieben werden.
Beispiel
Im folgenden Beispiel wird veranschaulicht, wie Sie die WriteEntityChunkByReference
-Methode verwenden, um Daten in die Antwort einzufügen. Außerdem wird veranschaulicht, wie der lInsertPosition
Parameter zum Einfügen oder Anfügen von Datenblöcken verwendet wird.
// Insert data from ostringstream into the response
// On error, Provider error status set here
// ostringstream buffer cleared for next call
HRESULT WECbyRefChunk( std::ostringstream &os, IHttpContext *pHttpContext,
IHttpEventProvider *pProvider, LONG InsertPosition= -1)
{
HRESULT hr = S_OK;
// create convenience string from ostringstream
std::string str(os.str());
HTTP_DATA_CHUNK dc;
dc.DataChunkType = HttpDataChunkFromMemory;
dc.FromMemory.BufferLength = static_cast<DWORD>(str.size());
dc.FromMemory.pBuffer = pHttpContext->AllocateRequestMemory( static_cast<DWORD>( str.size()+1) );
if(!dc.FromMemory.pBuffer){
hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
LOG_ERR_HR(hr,"AllocateRequestMemory");
pProvider->SetErrorStatus(hr);
return hr;
}
// use char pointer p for convenience
char *p = static_cast<char *>(dc.FromMemory.pBuffer);
strcpy_s(p, str.size()+1, str.c_str());
hr = pHttpContext->GetResponse()->WriteEntityChunkByReference( &dc, InsertPosition );
if (FAILED(hr)){
LOG_ERR_HR(hr,"AllocateRequestMemory");
pProvider->SetErrorStatus( hr );
}
os.str(""); // clear the ostringstream for next call
return hr;
}
REQUEST_NOTIFICATION_STATUS
CMyHttpModule::OnBeginRequest(
IHttpContext* pHttpContext,
IHttpEventProvider* pProvider
)
{
HRESULT hr;
static long cnt;
InterlockedIncrement (&cnt); // keep track of how many times we are called
cnt++;
IHttpRequest *pRequest = pHttpContext->GetRequest();
PCWSTR url = pRequest->GetRawHttpRequest()->CookedUrl.pAbsPath;
OutputDebugStringW( url );
// return unless requesting a HTML file
if( !wcsstr(url, L".htm"))
return RQ_NOTIFICATION_CONTINUE;
IHttpResponse * pHttpResponse = pHttpContext->GetResponse();
// Return most times so we can still view content
if( (cnt%5) || pHttpResponse == NULL)
return RQ_NOTIFICATION_CONTINUE;
TRC_MSG_FULL("HTML cnt = " << cnt );
static int insertPosCnt;
int insertPos = ++insertPosCnt%2 -1; // toggle between 0 and -1
// Use ostringstream to create some dynamic content
std::ostringstream os;
os << "<p /> first chunk callback count = " << cnt
<< " insertPos = " << insertPos << "<br />";
//
// WECbyRefChunk does all the work of inserting data into the response
//
hr = WECbyRefChunk( os, pHttpContext, pProvider, insertPos);
if (FAILED(hr))
return RQ_NOTIFICATION_FINISH_REQUEST;
os << "<br /> <b> Adding 2nd chunk in Bold </b> File insertPos = " << insertPos ;
hr = WECbyRefChunk( os, pHttpContext, pProvider,insertPos);
if (FAILED(hr))
return RQ_NOTIFICATION_FINISH_REQUEST;
os << " <p /> Last (3rd) Chunk added with default append chunk GetCurrentThreadId = "
<< GetCurrentThreadId();
// any errors will be logged/handled in WECbyRefChunk
WECbyRefChunk( os, pHttpContext, pProvider);
// End additional processing, not because of error, but so another request
// doesn't wipe out our WriteEntityChunkByReference
return RQ_NOTIFICATION_FINISH_REQUEST;
}
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
IHttpResponse-Schnittstelle
IHttpResponse::WriteEntityChunks-Methode