IGlobalTraceEventProvider::GetCurrentHttpRequestContext メソッド
要求固有のトレース イベントの HTTP コンテキストを取得します。
構文
virtual HRESULT GetCurrentHttpRequestContext(
IHttpContext** ppHttpContext
) = 0;
パラメーター
ppHttpContext
インターフェイスのアドレスへのポインター。それ以外の IHttpContext
場合は NULL。
戻り値
HRESULT
。 有効な値を次の表に示しますが、これ以外にもあります。
値 | 定義 |
---|---|
S_OK | 操作が成功したことを示します。 |
ERROR_NOT_SUPPORTED | メソッドがサポートされていないことを示します。 |
解説
GL_TRACE_EVENTイベント型に登録する CGlobalModule 派生クラスは、CGlobalModule::OnGlobalTraceEvent 純粋virtual
メソッドのパラメーターとして IGlobalTraceEventProvider ポインターを受け取ります。 その後、そのIGlobalTraceEventProvider
ポインターで メソッドを呼び出すことで、GetCurrentHttpRequestContext
IHttpContext ポインターを取得できます。
に GetCurrentHttpRequestContext
使用できる 1 つの用途は、イベントのカスタム バッファリングを提供することです。
GetCurrentHttpRequestContext
動作は実装によって異なります。 ガイドラインとして次の情報を使用する必要がありますが、すべてのシナリオで正しくない場合があります。
HTTP トレース イベントを提供するクラスは、ポインター メンバー変数を
private``IHttpContext
宣言します。 この変数は、有効なIHttpContext
ポインターの構築中に初期化されます。 を呼び出GetCurrentHttpRequestContext
すと、逆参照されたppHttpContext
パラメーターがこの変数に設定され、S_OKが返されます。グローバル トレース イベントを提供するクラスは、パラメーターを
ppHttpContext
変更せず、すぐにERROR_NOT_SUPPORTEDを返します。
実装側の注意
IGlobalTraceEventProvider
実装者は、このデータを使用したメモリ管理を担当します。そのため、IGlobalTraceEventProvider
動的メモリ割り当てを使用する実装者は、不要になったときにポインターをIHttpContext
解放または呼び出すdelete
必要があります。
呼び出し元に関する注意事項
IGlobalTraceEventProvider
実装者は、このデータを使用したメモリ管理を担当します。そのため、クライアントは、IGlobalTraceEventProvider
このデータが不要になった場合に、返されたIHttpContext
ポインターを解放したり、 を呼び出delete
したりすることはできません。
例
次のコード例では、 GL_TRACE_EVENT イベントをリッスンし、イベントをフィルター処理する HTTP_TRACE_CONFIGURATION 構造を宣言および初期化するグローバル モジュールを作成する方法を示します。 その後、モジュールは メソッドを IHttpContext
呼び出してポインターを GetCurrentHttpRequestContext
取得します。
#pragma warning( disable : 4290 )
#pragma warning( disable : 4530 )
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <tchar.h>
#include <initguid.h>
#include <httptrace.h>
#include <httpserv.h>
#include <httpcach.h>
// The CGlobalTraceModule class creates the CGlobalModule
// class and registers for GL_TRACE_EVENT events.
class CGlobalContainerModule : public CGlobalModule
{
public:
// Creates the destructor for the
// CGlobalTraceModule class.
virtual ~CGlobalContainerModule()
{
}
// The RegisterGlobalModule method creates and registers
// a new CGlobalTraceModule for GL_TRACE_EVENT events.
// dwServerVersion: the current server version.
// pModuleInfo: the current IHttpModuleRegistrationInfo pointer.
// pGlobalInfo: the current IHttpServer pointer.
// return: ERROR_NOT_ENOUGH_MEMORY if the heap is out of
// memory; otherwise, the value from the call to the
// SetGlobalNotifications method on the pModuleInfo pointer.
static HRESULT RegisterGlobalModule
(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo* pModuleInfo,
IHttpServer* pGlobalInfo
)
{
// The IHttpModuleRegistrationInfo
// pointermust not be NULL.
if (NULL == pModuleInfo)
{
return E_INVALIDARG;
}
// Get the HTTP_MODULE_ID from the
// IHttpModuleRegistrationInfo pointer.
HTTP_MODULE_ID moduleId =
pModuleInfo->GetId();
// The HTTP_MODULE_ID pointer
// must not be NULL.
if (NULL == moduleId)
{
return E_INVALIDARG;
}
// Create a new CGlobalContainerModule pointer
// using the HTTP_MODULE_ID from the
// IHttpModuleRegistrationInfo pointer.
CGlobalContainerModule* containerModule =
new CGlobalContainerModule(moduleId);
// Return an out-of-memory error if the containerModule
// is NULL after the call to the new operator.
if (NULL == containerModule)
{
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
// Attempt to set global notification
// for an GL_TRACE_EVENT event by using
// the traceModule as a listener.
HRESULT hr = pModuleInfo->SetGlobalNotifications
(containerModule, GL_TRACE_EVENT);
// Return the HRESULT from the call to
// the SetGlobalNotifications method.
return hr;
}
// The OnGlobalTraceEvent method is the callback
// method for GL_TRACE_EVENT events in the pipeline.
// pProvider: the IGlobalTraceEventProvider pointer.
// return: GL_NOTIFICATION_CONTINUE.
virtual
GLOBAL_NOTIFICATION_STATUS
OnGlobalTraceEvent
(
IN IGlobalTraceEventProvider* pProvider
)
{
// If the IGlobalTraceEventProvider pointer
// is NULL, return GL_NOTIFICATION_CONTINUE.
if (NULL == pProvider)
{
return GL_NOTIFICATION_CONTINUE;
}
// Declare an IHttpContext pointer.
IHttpContext* httpContext = NULL;
// Declare an HRESULT and initialize
// the HRESULT to E_FAIL.
HRESULT hr = E_FAIL;
// Call the GetCurrentHttpRequestContext
// method on the IGlobalTraceEventProvider
// pointer.
hr = pProvider->GetCurrentHttpRequestContext(&httpContext);
// Return GL_NOTIFICATION_CONTINUE.
return GL_NOTIFICATION_CONTINUE;
}
// The Terminate method is required for
// non-abstract CGlobalTraceModule classes.
// This method calls delete on this.
virtual VOID Terminate(VOID)
{
delete this;
}
// Creates the constructor for the CGlobalTraceModule
// class. This constructor initializes the CEventWriter
// to write to the application event log.
// moduleId: the current module identifier.
CGlobalContainerModule(HTTP_MODULE_ID moduleId)
{
m_moduleId = moduleId;
}
private:
// Specify the HTTP_MODULE_ID
// for this module.
HTTP_MODULE_ID m_moduleId;
};
// The RegisterModule method is the
// main entry point for the DLL.
// dwServerVersion: the current server version.
// pModuleInfo: the current
// IHttpModuleRegistrationInfo pointer.
// pGlobalInfo: the current IHttpServer pointer.
// return: the value returned by calling the
// CGlobalContainerModule::RegisterGlobalModule
// method.
HRESULT
__stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo* pModuleInfo,
IHttpServer* pGlobalInfo
)
{
// Call the static method for initialization.
return CGlobalContainerModule::RegisterGlobalModule
(dwServerVersion,
pModuleInfo,
pGlobalInfo);
}
モジュールは 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 |