如何將追蹤新增至 IIS 7.0 受控模組
簡介
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:進行備份
在執行本文中的工作之前,請先備份組態。 執行下列命令:
在該指令提示字元中執行下列命令:
%windir%\system32\inetsrv\appcmd add backup
步驟 4:建立範例內容
- 刪除資料夾中的所有內容
c:\inetpub\wwwroot
。 - 從上述的 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
注意
如果您在64位系統上執行此動作,請使用中的64位 c# 編譯程式進行編譯 %windir%\microsoft.net\framework64\v2.0.50727\csc.exe
請注意 /debug & /d:TRACE 參數的使用。 您必須使用這些參數,將追蹤事件編譯成二進位檔。 無法使用這些參數進行編譯,表示模組不會有任何追蹤事件。
編譯模組之後,請部署模組並執行初始測試,以查看模組是否可在擷取其追蹤之前運作。
將模組新增至月臺的組態
本節包含新增和測試模組。
步驟 1:將模組新增至月臺的設定
- 使用相同的 Administrator 命令提示字元,建立名為 \inetpub\wwwroot\bin 的目錄,然後將 IIS_MOD_REQDATA.dll 複製到該目錄。
- 啟用模組。 從系統管理員命令提示字元中,輸入 start inetmgr 來啟動 IIS 系統管理 UI。
- 在 [ 連線 ] 窗格底下,展開本機計算機 名稱,然後按兩下 [網站],然後按兩下 [預設網站]。
- 在中央窗格的 [IIS ] 底下,按兩下 [模組]:
- 您會看到已設定供此網站使用的大型模組清單。 在UI右側的 [ 動作] 底下,按兩下 [ 新增受控模組]:
- 在顯示的視窗中,將Managed模組命名 為IIS_MOD_REQDATA ,且模組的類型 IIS_MOD_REQDATA。IIS_MOD_REQDATA (從下拉式清單框中選取此選項) :
- 按一下 [確定]。 新追蹤的模組現在已針對網站的使用進行設定。
步驟 2:測試我們的課程模組
開啟 Internet Explorer 並流覽至 http://localhost/test.htm
來測試模組。 您會看到下列視窗:
「要求標頭」&「回應標頭」內容來自我們的課程模組,指出運作正常。
將事件路由傳送至 IIS
此工作會將模組的 TraceSource 連結至 IIS 追蹤,以便透過 IIS 發出其事件,然後設定失敗要求追蹤來擷取這些追蹤事件。
步驟 1:啟用模組 TraceSource & 將其事件路由傳送至 IIS
模組會更新為包含追蹤事件。 設定 System.Diagnostics 和 IIS 以擷取這些追蹤事件,並將其路由傳送至 IIS 的失敗要求追蹤模組。 若要這樣做, <請在 web.config 檔案中設定 system.diagnostics> 區段,以據以設定 TraceSource & 路由其事件。
使用系統管理員命令提示字元,流覽至
c:\inetpub\wwwroot
,並使用記事本編輯您的 web.config 檔案。設定有 3 個部分必須完成,才能讓模組發出的事件路由傳送至 IIS 的追蹤基礎結構:
- 將 IIS 事件 traceListener 定義為共用接聽程式
- 定義參數以啟用所有事件
- 定義追蹤來源,並附加我們定義的參數,以及定義來源的追蹤接聽程式。
IIS 會提供新的 System.Diagnostics.TraceListener,用來將 TraceSource 事件路由傳送至 IIS 的追蹤基礎結構。 此提供者也必須定義在您的 web.config 檔案中。
(tsStatus) 名稱定義 traceSource,並將它連線至 DefaultSwitch & IisTraceListener。
複製並貼上此<系統。在區段) 之後
<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。 若要設定失敗的要求追蹤以挑選下列專案:
從系統管理員命令提示字元中,輸入 start inetmgr。 在 [ 連線 ] 面板中,展開計算機名稱,然後展開 [月臺] 資料夾,然後按兩下 [預設網站]。 在 [動作] 窗格右側,按下 [設定] 底下的 [失敗要求追蹤...] 連結:
核取 [ 啟用 ] 複選框。 保留其他設定的預設值。 按一下 [確定] 繼續進行。
既然我們已確認已啟用失敗的要求追蹤記錄,我們必須設定失敗定義。 回到 IIS 管理員的 IIS 底下,按兩下 失敗的要求追蹤規則
在 [ 動作] 窗格中,按兩下 [新增]。 這會啟動 [新增失敗的要求追蹤規則 ] 精靈。
按一下 [下一步]。 [ 選取追蹤提供者] 頁面隨即出現。 選取 [ASPNET ] 複選框和 [區域] 底下的 [ 模組 & 頁面 ] 複選框。 在 [詳細資訊] 底下,選取 [詳細資訊]。
注意
由於伺服器 Beta 3 組建中的 Bug,只有在選取 [模組] 和 [頁面] 區域時,才能擷取模塊追蹤。 Post Server Beta 3,只有模組才能收集這些事件。
測試和檢視結果
在此工作中,我們會產生失敗的要求,並檢視產生的追蹤記錄。 請記住,我們已設定 IIS 來擷 http://localhost/取 200 失敗之 * 要求的追蹤記錄。 若要確認它是否正常運作:
- 開啟新的 Internet Explorer 視窗。 在位址
http://localhost/test.htm
中輸入 。 同樣地,您會看到下列內容:
- 若要確認模組已產生已擷取的追蹤,請使用系統管理員提升許可權的 Internet Explorer 視窗,然後按 CTRL-O,然後流覽至
c:\inetpub\logs\FailedReqLogFiles\W3SVC1
。 在讀取 HTML 檔案的下拉式清單中,選取 [所有檔案]。 - 選取最新的fr#######.xml 檔案 (今天日期) ,然後按兩下 [ 開啟]。 您會看到事件:
摘要
您已完成將新的追蹤事件新增至 Managed 模組、編譯並部署該模組、已設定 System.Diagnostics 將其事件路由傳送至 IIS 的追蹤基礎結構,最後,已設定 IIS 的失敗要求追蹤功能來擷取其事件。 您現在可以輕鬆地將新事件新增至模組,然後將模組重新編譯 & 部署到 \bin 目錄。 使用失敗的要求追蹤,您會看到事件的結果。
請記住,使用 System.Diagnostics.TraceSource 可讓您仍使用模組及其追蹤事件向下層級,前提是您已將其連結至不同的追蹤接聽程式。