다음을 통해 공유


HTTP_TRACE_EVENT 구조체

추적 공급자에서 반환된 추적 정보를 포함합니다.

구문

struct HTTP_TRACE_EVENT{  
   LPCGUID pProviderGuid;  
   DWORD dwArea;  
   LPCGUID pAreaGuid;  
   DWORD dwEvent;  
   LPCWSTR pszEventName;  
   DWORD dwEventVersion;  
   DWORD dwVerbosity;  
   LPCGUID pActivityGuid;  
   LPCGUID pRelatedActivityGuid;  
   DWORD dwTimeStamp;  
   DWORD dwFlags;  
   DWORD cEventItems;  
   __field_ecount(cEventItems) HTTP_TRACE_EVENT_ITEM * pEventItems;  
};  

멤버

멤버 이름 설명
pProviderGuid LPCGUID 공급자의 식별자를 포함하는 입니다. 가능한 값은 추적 상수에 정의된 추적 GUID 섹션의 값을 포함하지만 이에 국한되지 않습니다.
dwArea DWORD 이벤트에 대한 관심 영역을 포함하는 입니다. 영역 값은 양의 정수여야 합니다.
pAreaGuid LPCGUID 관심 영역을 나타내는 입니다.
dwEvent DWORD 이벤트 공급자에 대한 이벤트의 고유 식별자를 포함하는 입니다.
pszEventName LPCWSTR 이벤트의 이름을 포함하는 입니다. 이 값은 이벤트 형식에 대한 설명을 제공하기 위해 이벤트 공급자에 의해 설정됩니다.
dwEventVersion DWORD 이벤트 버전을 포함하는 입니다. 일반적으로 0 또는 1이지만 무한 정수 값을 포함할 수 있습니다.
dwVerbosity DWORD 숫자 값을 자세한 정보 표시에 매핑하는 입니다(값 0~5는 일반, FatalError, 오류, 경고, 정보 및 자세한 정보로 매핑됨).
pActivityGuid LPCGUID 고유한 요청 식별자를 포함하는 입니다.
pRelatedActivityGuid LPCGUID 관련 활동을 연결하기 위한 값이 들어 있는 입니다. 대부분의 공급자는 이 값을 NULL로 설정한 다음, 이벤트 수신기에 이벤트를 보내기 전에 IIS가 값을 채울 수 있도록 허용합니다.
dwTimeStamp DWORD 내부 틱 수로 표시되는 선택적 타임스탬프를 포함하는 입니다.
dwFlags DWORD 추가 플래그를 포함하는 입니다. 대부분의 공급자는 추적 상수에 정의된 추적 상수 섹션에 설명된 이 값을 HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS 설정합니다.
cEventItems DWORD 배열의 요소 수를 포함하는 입니다pEventItems.
pEventItems HTTP_TRACE_EVENT_ITEM 구조 체의 배열입니다 cEventItems.

설명

구조체의 HTTP_TRACE_EVENT 멤버 대부분은 ETW(Windows용 이벤트 추적) 이벤트에 직접 매핑됩니다. 및 pAreaGuid 멤버는 dwArea IIS에 고유합니다.

GL_TRACE_EVENT 이벤트 형식에 등록하는 CGlobalModule 파생 클래스는 CGlobalModule::OnGlobalTraceEvent pure virtual 메서드의 매개 변수로 IGlobalTraceEventProvider 포인터를 받습니다. 그런 다음, NULL HTTP_TRACE_EVENT 구조체의 주소에 대한 포인터를 제공하는 IGlobalTraceEventProvider::GetTraceEvent 메서드를 호출하여 포인터를 검색 HTTP_TRACE_EVENT 할 수 있습니다.

자세한 내용은 상수 추적을 참조하세요.

pAreaGuid 멤버는 dwArea 이벤트에 대한 관심 영역에 대해 서로 다른 두 개의 상수를 포함합니다.

예제

다음 예제에서는 구조를 채우고 HTTP_TRACE_EVENTIHttpTraceContext::RaiseTraceEvent 메서드를 호출합니다.

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
    // (from a GIF or .css style sheet on the same HTML page)
    // doesn't wipe out our WriteEntityChunkByReference. We can also get the
    // WriteEntityChunkByReference prepended to our normal HTML page. 

    return RQ_NOTIFICATION_FINISH_REQUEST;

}

class My_Events
{
public:
    static	LPCGUID	GetAreaGuid( VOID ){ //  GUID for the event class
        static const GUID AreaGuid = 
        {0xacade3b2,0xb7d7,0x4339,{0x95,0x6c,0x81,0x1b,0x4e,0xdb,0x1b,0x24}};
        return &AreaGuid;
    };

    static	LPCGUID	GetProviderGuid( VOID ){ // GUID for the event Provider
        static const GUID PrvderGuid = 
        // {EB881638-214A-4f2a-9B39-933770822D18}
    { 0xeb881638, 0x214a, 0x4f2a, { 0x9b, 0x39, 0x93, 0x37, 0x70, 0x82, 0x2d, 0x18 } };
;
        return &PrvderGuid;
    };


    class My_COMPLETION
    {
    public:
        static	HRESULT	RaiseEvent(
            IHttpTraceContext * pHttpTraceContext,
            LONG InsertPosition
            )
            //
            // Raise Cmy_COMPLETION Event
            //
        {
            HTTP_TRACE_EVENT Event;
            Event.pProviderGuid = My_Events::GetProviderGuid();
            Event.dwArea = 1;
            Event.pAreaGuid = My_Events::GetAreaGuid();
            Event.dwEvent = 1;
            Event.pszEventName = L"NOTIFY_MY_CSTM_WECBR_EVNT";
            Event.dwEventVersion = 2;
            Event.dwVerbosity = 1;
            Event.cEventItems = 1;
            Event.pActivityGuid = NULL;
            Event.pRelatedActivityGuid = NULL;
            Event.dwTimeStamp = 0;
            Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS;

            // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS

            HTTP_TRACE_EVENT_ITEM Items[ 1 ];
            Items[ 0 ].pszName = L"InsertPosition";
            Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LONG; // mof type (object)
#pragma warning (disable:4312)
            Items[ 0 ].pbData = (PBYTE) InsertPosition;
            Items[ 0 ].cbData = 4;
            Items[ 0 ].pszDataDescription = L"Insert Position";
            Event.pEventItems = Items;
            return pHttpTraceContext->RaiseTraceEvent( &Event );
        };

    };
};

실패한 요청 추적이 제대로 구성된 경우 추적 로그에 NOTIFY_MODULE_STARTNOTIFY_MODULE_END 이벤트가 표시됩니다. 실패한 요청 로깅에 대한 자세한 내용은 IIS 7.0에서 실패한 요청에 대한 추적 구성을 참조하세요. 아래 XML은 NOTIFY_MODULE_START 실패한 요청 추적 로그의 부분입니다. 대부분의 데이터는 시스템에 종속되며 아래 이벤트와 일치하지 않습니다.

   <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">  
 <System>  
  <Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>  
  <EventID>0</EventID>  
  <Version>1</Version>  
  <Level>5</Level>  
  <Opcode>1</Opcode>  
  <Keywords>0x100</Keywords>  
  <TimeCreated SystemTime="2007-08-27T21:10:30.186Z"/>  
  <Correlation ActivityID="{00000000-0000-0000-9800-0080000000FA}"/>  
  <Execution ProcessID="1308" ThreadID="3608"/>  
  <Computer>N2-IIS</Computer>  
 </System>  
 <EventData>  
  <Data Name="ContextId">{00000000-0000-0000-9800-0080000000FA}</Data>  
  <Data Name="ModuleName">A_raizeEvent</Data>  
  <Data Name="Notification">1</Data>  
  <Data Name="fIsPostNotification">false</Data>  
  <Data Name="fIsCompletion">false</Data>  
 </EventData>  
 <RenderingInfo Culture="en-US">  
  <Opcode>NOTIFY_MODULE_START</Opcode>  
  <Keywords>  
   <Keyword>RequestNotifications</Keyword>  
  </Keywords>  
  <freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>  
 </RenderingInfo>  
 <ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">  
  <EventGuid>{002E91E3-E7AE-44AB-8E07-99230FFA6ADE}</EventGuid>  
 </ExtendedTracingInfo>  
</Event>  

요구 사항

형식 Description
클라이언트 - 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
헤더 Httptrace.h

참고 항목

웹 서버 핵심 구조