共用方式為


如何將追蹤新增至 IIS 7.0 受控模組

Saad Ladki

簡介

IIS 7.0 和更新版本功能可讓您外掛程式並使用自定義開發的 Managed 模組來完成許多不同的工作,並將這些模組用於各種內容。 不過,發生問題:如果模組有問題或困難,會發生什麼情況? 先前,您使用 System.Diagnostics 在發生問題時追蹤事件。 不幸的是,這些追蹤與 IIS 追蹤完全分開。

與 IIS 7.0 和更新版本不一致。 現在您可以使用 System.Diagnostics.TraceSource 將追蹤新增至模組程式代碼, (新增至 .Net 2.0) 。 您能夠將這些追蹤路由傳送到 IIS 追蹤基礎結構,讓這些追蹤可供使用追蹤的模組使用,例如「失敗的要求追蹤」。

IIS 小組鼓勵使用基本模式來檢測程序代碼,例如:

  • START & 停止程式代碼內重要活動的停止事件
  • 警告 & 意外發生時發生錯誤事件,可能導致要求失敗 (,例如驗證失敗)
  • INFORMATIONAL & VERBOSE 事件,以協助診斷,例如所使用的模組組態

這個逐步解說中所述的工作包括:

  • 使用 System.Diagnostics.TraceSource 將追蹤新增至模組
  • 設定失敗的要求追蹤以擷取這些追蹤
  • 產生失敗狀況並檢視產生的追蹤

必要條件

請先遵循下列步驟,再執行本文中的工作。

步驟 1:安裝 IIS

首先,必須安裝 IIS。 流覽至 http://localhost/以查看是否已安裝 IIS。 如果已安裝 IIS,您會看到 [建構中] 頁面。 如果未安裝 IIS,請參閱 安裝 IIS 以取得指示。 請務必安裝下列 IIS 元件:

  • 萬維網服務下的 ASP (=> 應用程式開發功能 => ASP)
  • ASP.Net (World Wide Web Services => 應用程式開發功能 => ASP.Net)
  • 萬維網服務下的追蹤 (=> 健康情況 & 診斷 => 追蹤)

步驟 2:以系統管理員身分登入

以系統管理員帳戶或系統管理員群組中的身分登入。

注意

在 Administrators 群組中,預設不會授與您完成系統管理員許可權。 您必須以系統管理員身分執行許多應用程式。 以滑鼠右鍵按兩下應用程式圖示,然後選擇 [以系統管理員身分執行]。

步驟 3:進行備份

在執行本文中的工作之前,請先備份組態。 執行下列命令:

  1. 按兩下 [開始] 按鈕 -> 所有程式 -> 配件 -> (r-click) 命令提示字元 -> 以系統管理員身分執行
    Windows \[開始\] 功能表的螢幕快照,其中焦點位於右鍵下拉功能表中的 \[以系統管理員身分執行\] 選項。

  2. 在該指令提示字元中執行下列命令:

    %windir%\system32\inetsrv\appcmd add backup
    

步驟 4:建立範例內容

  1. 刪除資料夾中的所有內容 c:\inetpub\wwwroot
  2. 從上述的 Administrator 命令提示字元中,將附加程式代碼貼到名為 test.htm的 inetpub\wwwroot 檔案中:
<h2>HOWTO: Adding tracing to modules </h2>
This is a sample page served by the static file handler (native code).

建立 & 追蹤簡單模組

在本節中,您會建立要檢測的範例模組。

步驟 1:建立簡單模組

使用系統管理員命令提示字元,將下列程式代碼複製並貼到名為 IIS_MOD_REQDATA.cs 的檔案中:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
        }

        public void Dispose()
        {
        }
    }
}

步驟 2:將追蹤新增至 Managed 模組

若要將追蹤新增至模組,並將其追蹤事件路由至 IIS,請使用 System.Diagnostics.Trace 來源。 在using語句底下新增下列這一行:

using System.Diagnostics;

您必須在程式代碼內建立 TraceSource , 請注意IIS_MOD_REQDATA模組宣告內的 traceSource 定義:

public class IIS_MOD_REQDATA : IHttpModule
{
    TraceSource tsStatus;

tsStatus 成員會在 IHttpModule 的 Init () 方法期間初始化:

public void Init(HttpApplication application)    
{    
    application.EndRequest += (new EventHandler(this.Application_EndRequest));
    // setup traceSource
    tsStatus = new TraceSource("tsStatus");    
}

TraceSource (“tsStatus”) 的名稱很重要,因為稍後會在 web.config 檔案中參考此名稱。 模組現在已設定為視需要發出事件。

若要新增追蹤事件,請使用 tsStatus.TraceEvent (<type,0,somestring><>) 來寫出事件。 將建議的 Start & End 事件新增至 Application_EndRequest () 方法:

private void Application_EndRequest(Object source, EventArgs e)        
{    
    tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

    // other code

    tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] END EndRequest");    
}

請注意不同類型的 <>– 支援的型別等等,包括:

  • TraceEventType.Start
  • TraceEventType.Stop
  • TraceEventType.Error
  • TraceEventType.Warning
  • TraceEventType.Information
  • TraceEventType.Verbose

為了完整起見,模組的整個來源 (包括追蹤事件) ,可以從這裡複製:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Diagnostics;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {

        TraceSource tsStatus;

        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));

            // TRACING

            tsStatus = new TraceSource("tsStatus");
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Req Data, moving onto Response");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            if (context.Response.StatusCode > 399)
            {
                tsStatus.TraceEvent(TraceEventType.Warning, 0, "[REQDATA MODULE] error status code detected");
            }

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Response Data");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] cache setting is (" + context.Response.Cache.ToString() + ")");

            tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] STOP - EndRequest");
        }

        public void Dispose()
        {
        }
    }
}

步驟 3:編譯追蹤模組

現在,若要編譯模組 & 部署模組。 在系統管理員命令提示字元中,執行下列命令:

%systemroot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:library /out:IIS_MOD_REQDATA.dll /debug /d:TRACE /R:System.Web.dll IIS_MOD_REQDATA.cs

記事本中驚嘆號虛線控制台Main 命令的螢幕快照。

注意

如果您在64位系統上執行此動作,請使用中的64位 c# 編譯程式進行編譯 %windir%\microsoft.net\framework64\v2.0.50727\csc.exe

請注意 /debug & /d:TRACE 參數的使用。 您必須使用這些參數,將追蹤事件編譯成二進位檔。 無法使用這些參數進行編譯,表示模組不會有任何追蹤事件。

編譯模組之後,請部署模組並執行初始測試,以查看模組是否可在擷取其追蹤之前運作。

將模組新增至月臺的組態

本節包含新增和測試模組。

步驟 1:將模組新增至月臺的設定

  1. 使用相同的 Administrator 命令提示字元,建立名為 \inetpub\wwwroot\bin 的目錄,然後將 IIS_MOD_REQDATA.dll 複製到該目錄。
  2. 啟用模組。 從系統管理員命令提示字元中,輸入 start inetmgr 來啟動 IIS 系統管理 UI。
  3. 在 [ 連線 ] 窗格底下,展開本機計算機 名稱,然後按兩下 [網站],然後按兩下 [預設網站]。
  4. 在中央窗格的 [IIS ] 底下,按兩下 [模組]:
    [默認網站首頁] 畫面的螢幕快照,其中已醒目提示 [模組] 選項。
  5. 您會看到已設定供此網站使用的大型模組清單。 在UI右側的 [ 動作] 底下,按兩下 [ 新增受控模組]:
    [動作] 窗格的螢幕快照,其中著重於 [新增受控模組] 選項。
  6. 在顯示的視窗中,將Managed模組命名 為IIS_MOD_REQDATA ,且模組的類型 IIS_MOD_REQDATA。IIS_MOD_REQDATA (從下拉式清單框中選取此選項) :
    [新增受控模組] 對話框的螢幕快照,其中顯示 [名稱] 和 [類型] 字段。
  7. 按一下 [確定]。 新追蹤的模組現在已針對網站的使用進行設定。
    [模組] 畫面的螢幕快照,其中顯示新追蹤的模組。

步驟 2:測試我們的課程模組

開啟 Internet Explorer 並流覽至 http://localhost/test.htm來測試模組。 您會看到下列視窗:

這裡讀取網頁的螢幕快照是靜態檔案處理程式所提供的範例頁面。

「要求標頭」&「回應標頭」內容來自我們的課程模組,指出運作正常。

將事件路由傳送至 IIS

此工作會將模組的 TraceSource 連結至 IIS 追蹤,以便透過 IIS 發出其事件,然後設定失敗要求追蹤來擷取這些追蹤事件。

步驟 1:啟用模組 TraceSource & 將其事件路由傳送至 IIS

模組會更新為包含追蹤事件。 設定 System.Diagnostics 和 IIS 以擷取這些追蹤事件,並將其路由傳送至 IIS 的失敗要求追蹤模組。 若要這樣做, <請在 web.config 檔案中設定 system.diagnostics> 區段,以據以設定 TraceSource & 路由其事件。

  1. 使用系統管理員命令提示字元,流覽至 c:\inetpub\wwwroot,並使用記事本編輯您的 web.config 檔案。

  2. 設定有 3 個部分必須完成,才能讓模組發出的事件路由傳送至 IIS 的追蹤基礎結構:

    • 將 IIS 事件 traceListener 定義為共用接聽程式
    • 定義參數以啟用所有事件
    • 定義追蹤來源,並附加我們定義的參數,以及定義來源的追蹤接聽程式。
  3. IIS 會提供新的 System.Diagnostics.TraceListener,用來將 TraceSource 事件路由傳送至 IIS 的追蹤基礎結構。 此提供者也必須定義在您的 web.config 檔案中。

  4. (tsStatus) 名稱定義 traceSource,並將它連線至 DefaultSwitch & IisTraceListener

  5. 複製並貼上此<系統。在區段) 之後<system.webServer>,web.config 檔案中的診斷>區段 (。

    <system.diagnostics>
        <sharedListeners>
          <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </sharedListeners>
    
        <switches>
          <add name="DefaultSwitch" value="All" />
        </switches>
    
        <sources>
          <source name="tsStatus" switchName="DefaultSwitch">
            <listeners>
              <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </listeners>
          </source>
        </sources>
    </system.diagnostics>
    

tsStatus traceSource 會連線到 IIS7TraceListener,這會將事件發出至 IIS 的追蹤基礎結構。 繼續進行下一個步驟,將這些事件連線到失敗的要求追蹤提供者。

步驟 2:啟用失敗的要求追蹤以擷取模塊追蹤事件

當這些診斷事件發出至 IIS 的追蹤基礎結構時,這些事件會對應至該提供者上的 ASP.net 提供者 & 模組旗標。 其詳細信息取決於使用的 TraceEventType。 若要設定失敗的要求追蹤以挑選下列專案:

  1. 從系統管理員命令提示字元中,輸入 start inetmgr。 在 [ 連線 ] 面板中,展開計算機名稱,然後展開 [月臺] 資料夾,然後按兩下 [預設網站]。 在 [動作] 窗格右側,按下 [設定] 底下的 [失敗要求追蹤...] 連結:
    [動作] 窗格 [管理網站] 區段的螢幕快照,其中已醒目提示 [失敗要求追蹤] 選項。

  2. 在下一個對話框中,設定下列專案:
    [編輯網站失敗要求追蹤設定] 對話框的螢幕快照。

  3. 核取 [ 啟用 ] 複選框。 保留其他設定的預設值。 按一下 [確定] 繼續進行。

  4. 既然我們已確認已啟用失敗的要求追蹤記錄,我們必須設定失敗定義。 回到 IIS 管理員的 IIS 底下,按兩下 失敗的要求追蹤規則
    默認網站首頁畫面的螢幕快照,其中已醒目提示 [失敗要求追蹤規則] 選項。

  5. 在 [ 動作] 窗格中,按兩下 [新增]。 這會啟動 [新增失敗的要求追蹤規則 ] 精靈。

  6. 在 [ 指定要追蹤的內容 ] 頁面上,針對要追蹤的內容選取 [ 所有內容] (*) 選項。 按一下 [下一步]。
    [新增失敗要求追蹤規則] 頁面的螢幕快照,其中著重於 [下一步] 選項。

  7. 在 [ 定義追蹤條件 ] 畫面中,核取 [ 狀態代碼 ] 複選框,& 輸入 “200” 作為要追蹤的狀態代碼。
    [定義追蹤條件] 畫面的螢幕快照,其中已核取 [狀態代碼] 字段。

  8. 按一下 [下一步]。 [ 選取追蹤提供者] 頁面隨即出現。 選取 [ASPNET ] 複選框和 [區域] 底下的 [ 模組 & 頁面 ] 複選框。 在 [詳細資訊] 底下,選取 [詳細資訊]。
    [選取追蹤提供者] 畫面的螢幕快照,其中已醒目提示 [ASPNET 提供者] 選項。

    注意

    由於伺服器 Beta 3 組建中的 Bug,只有在選取 [模組] 和 [頁面] 區域時,才能擷取模塊追蹤。 Post Server Beta 3,只有模組才能收集這些事件。

  9. 按一下 [完成] 。 您會看到預設網站的下列定義:
    失敗要求追蹤規則畫面的螢幕快照。

測試和檢視結果

在此工作中,我們會產生失敗的要求,並檢視產生的追蹤記錄。 請記住,我們已設定 IIS 來擷 http://localhost/取 200 失敗之 * 要求的追蹤記錄。 若要確認它是否正常運作:

  1. 開啟新的 Internet Explorer 視窗。 在位址 http://localhost/test.htm中輸入 。 同樣地,您會看到下列內容:
    Internet Explorer 視窗中範例網頁的螢幕快照。
  2. 若要確認模組已產生已擷取的追蹤,請使用系統管理員提升許可權的 Internet Explorer 視窗,然後按 CTRL-O,然後流覽至 c:\inetpub\logs\FailedReqLogFiles\W3SVC1。 在讀取 HTML 檔案的下拉式清單中,選取 [所有檔案]。
  3. 選取最新的fr#######.xml 檔案 (今天日期) ,然後按兩下 [ 開啟]。 您會看到事件:
    [要求診斷] 畫面的螢幕快照,其中顯示 [自定義模塊追蹤] 索引標籤。

摘要

您已完成將新的追蹤事件新增至 Managed 模組、編譯並部署該模組、已設定 System.Diagnostics 將其事件路由傳送至 IIS 的追蹤基礎結構,最後,已設定 IIS 的失敗要求追蹤功能來擷取其事件。 您現在可以輕鬆地將新事件新增至模組,然後將模組重新編譯 & 部署到 \bin 目錄。 使用失敗的要求追蹤,您會看到事件的結果。

請記住,使用 System.Diagnostics.TraceSource 可讓您仍使用模組及其追蹤事件向下層級,前提是您已將其連結至不同的追蹤接聽程式。