ASP.NET 健康監視事件概觀
更新:2007 年 11 月
ASP.NET 健康監視可讓系統管理員監視已部署之 Web 應用程式的狀態。
注意事項: |
---|
需要中度或更高的信任才能引發健康監視事件。 |
這個主題包含:
案例
ASP.NET 健康監視功能
Background
程式碼範例
類別參考
案例
ASP.NET 健康監視可讓您執行下列作業:
監視應用程式的效能以確保狀況正常。
快速診斷失敗的應用程式或系統。
評估應用程式生命週期期間的重大事件。
以個別方式或透過 Web 伺服陣列,監視實際 ASP.NET 應用程式。
記錄事件,但不一定是與 ASP.NET 應用程式中之錯誤相關的事件。
回到頁首
功能
ASP.NET 健康監視系統包括:
封裝應用程式健康狀態資訊的事件類型。
處理事件資訊的提供者類型。
協助您管理健康事件的其他類型。
回到頁首
背景
ASP.NET 健康監視讓您能夠輕鬆監視 ASP.NET 應用程式的健康狀態,並且取得 ASP.NET 資源的執行階段詳細資訊 (以檢測應用程式)。健康監視包含已準備好可以使用的 Web 健康監視事件類別 (也稱為 Web 事件),以及健康監視提供者 (接聽程式)。Web 事件會封裝健康事件資訊。
提供者會接聽事件並且使用事件資訊,通常是透過記錄資訊或通知系統管理員。您可以在應用程式組態檔中進行設定,將 Web 事件連接至提供者 (稱為「啟用事件」(Enabling the Event))。
ASP.NET 健康監視系統是使用 System.Web.Management 命名空間中的類別所實作的。
設定 ASP.NET 健康監視
您可以將應用程式設定為使用內建或自訂的監視提供者,以便處理健康監視資訊,以及報告所檢測之應用程式的健康狀態和效能特色。
您要設定組態檔中的 healthMonitoring 區段,將 Web 事件及提供者加入至應用程式。然後使用內建或自訂的類別以接聽事件資料並加以處理。
如需組態檔的詳細資訊,請參閱ASP.NET 組態檔。
Web 事件類別階層架構
當引發 Web 事件時,會建立關聯之事件類別的執行個體。而此物件的屬性便會收集事件資料。事件提供者會處理這些資料。
Web 事件可以包含背景工作處理序、應用程式定義域、要求資料、回應資料、應用程式錯誤、組態錯誤和稽核事件的相關資訊。父事件類別中包含的健康資訊會由所有子事件類別繼承。
下列圖表顯示 Web 事件類別之間的關聯性。
Web 事件類別階層架構
Web 事件類別階層架構中越是下層的事件,資料相對於 ASP.NET 應用程式就越具體。例如,衍生類別 (Derived Class) 可以公開堆疊追蹤、用戶端 IP、執行緒和處理序等資訊。
Web 事件資訊
下表列出的資訊,可幫助您決定要使用或繼承哪一個 Web 事件類別。資料列指的是 Web 事件類別。資料行指的是資訊類別,這些類別通常在 Web 事件類別中做為屬性使用。
如果您的應用程式不是在完全信任下執行,則只有 WebBaseEvent 類別是可繼承的。這麼做可以避免在資料表中列出資訊類別,而公開敏感資訊。
Web 事件類別 |
|||||
---|---|---|---|---|---|
這個類別所產生的資料 |
無法使用 |
無法使用 |
無法使用 |
無法使用 |
|
父類別產生的資料。 |
這個類別所產生的資料 |
無法使用 |
無法使用 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
這個類別所產生的資料 |
無法使用 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
這個類別所產生的資料 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
無法使用 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
無法使用 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
這個類別所產生的資料 |
這個類別所產生的資料 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
父類別產生的資料。 |
父類別產生的資料。 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
這個類別所產生的資料 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
父類別產生的資料。 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
父類別產生的資料。 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
父類別產生的資料。 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
父類別產生的資料。 |
無法使用 |
|
父類別產生的資料。 |
父類別產生的資料。 |
無法使用 |
父類別產生的資料。 |
無法使用 |
提供者類別階層架構
ASP.NET 含有一些您可用來處理 Web 事件的內建提供者。您也可以從內建類別繼承,以便建立自訂提供者,但會受限於下列繼承限制:
WebEventProvider 類別可由在任何信任層級下執行的應用程式繼承。
BufferedWebEventProvider 類別可由在任何信任層級下執行的應用程式繼承。
SqlWebEventProvider 類別只可由在完全信任下執行的應用程式繼承。
無論是何種信任層級,應用程式都無法繼承其他類別。如需詳細資訊,請參閱個別提供者類別的概觀。
下圖顯示 System.Web.Management 命名空間的 Web 提供者類別之間的關聯。
Web 提供者類別階層架構
使用 ASP.NET 健康監視事件
您可以透過下列方式使用 ASP.NET 健康監視事件:
使用內建 Web 事件和提供者類別。一般而言,您不需要提供任何 ASP.NET Web 事件類別的自訂實作。請注意,您的應用程式不會引發這些事件,.NET Framework 才會引發。但是,您必須按照本主題稍後的說明設定這些事件。如需詳細資訊,請參閱 HOW TO:傳送健康監視通知的電子郵件。
為 Web 事件或提供者建立自訂類別。如果您需要將自訂資訊附加至內建 Web 事件所提供的項目中,通常會建立自訂 Web 事件。如果要透過內建提供者可使用之機制以外的方法傳遞事件資料,則通常會建立自訂提供者。如需詳細資訊,請參閱擴充 ASP.NET 健康監視事件。
使用內建 Web 事件和提供者
使用健康監視的內建 Web 事件及提供者,是最常使用的方法。您只需要設定應用程式就可使用您需要的事件及提供者。必須執行下列動作:
將您需要的內建 ASP.NET Web 事件類別,加入至應用程式組態檔之 healthMonitoring 區段的 eventMappings 項目中。
將使用事件的提供者加入至 healthMonitoring 區段的 providers 項目。
將項目加入至可定義事件和提供者之間關聯的 rules 項目。
根據預設,會在根 Web.config 檔案的 healthMonitoring 區段中設定內建 ASP.NET 健康監視類別。healthMonitoring 區段會建立下列預設組態:
所有衍生自 WebBaseEvent 的 Web 事件類別都會在 eventMappings 項目中指定。這個區段可用來將易記名稱指派給事件類別群組。
衍生自 WebBaseEvent 的所有事件類別,至少會包含在 eventMappings 項目所定義的其中一個群組中。
EventLogWebEventProvider、WmiWebEventProvider 和 SqlWebEventProvider 事件提供者會在 providers 項目中指定。您可以在 providers 項目中指定其他內建提供者,例如 SimpleMailWebEventProvider、TemplatedMailWebEventProvider 或 TraceWebEventProvider 類別。
使 Web 錯誤和稽核失敗事件與 EventLogWebEventProvider 類別產生關聯的規則,則會在 rules 項目中指定。您可以加入多個 rules 項目,藉此啟用其他 Web 事件及提供者。如果事件對應至 rules 項目中的事件提供者,事件就會被視為已啟用。必須針對事件設定 eventMappings 和 providers 項目,但除非在 rules 項目中將兩個連接,否則不會啟用事件。
您可以為設定的項目指定參數值。例如,會限制可以發生的事件數目、指定兩個事件之間的間隔,或指定 SQL 及郵件提供者之事件緩衝處理選項的參數。
設定自訂提供者
如果需要自訂 Web 事件資訊的處理,您可以建置自訂健康事件提供者。您的提供者是一個類別,繼承自 WebEventProvider 或 BufferedWebEventProvider 類別。如需範例,請參閱 HOW TO:實作健康監視自訂提供者範例。建立自訂提供者,是最常見的健康監視自訂。您必須以下列方式修改組態檔:
將處理事件的自訂提供者加入至組態檔中 healthMonitoring 區段的 providers 項目。
將項目加入至可定義事件和提供者之間關聯的 rules 項目。
將包含自訂提供者實作之組件放在應用程式的 Bin 子目錄中。您無法將提供者原始程式碼檔放在 App_Code 子目錄中,因為在編譯 App_Code 子目錄中的任何程式碼檔之前,就會先設定並建立健康監視系統。
providers 項目的 type 屬性至少需有類別名稱。如果組件不在應用程式的 Bin 目錄中,則組件必須是強式名稱且安裝在全域組件快取中。在這個情況下,providers 項目的 type 屬性會要求完整的強式名稱,如下面的範例所示,其中 Version 及 PublicKeyToken 值符合您的組件:
type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=n.n.n.n,Culture=neutral, PublicKeyToken=xxxx"
下列範例示範如何使 SampleCustomEventProvider 提供者和 WebHeartbeatEvent 事件產生關聯。根目錄 Web.config 檔中已經設定 Heartbeats 事件。
<healthMonitoring
heartBeatInterval="1"
enabled="true">
<rules>
<add
name="Heartbeat Events"
eventName="Heartbeats"
provider="Sample Custom Event Provider"
profile="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:01:00"
custom=""
/>
</rules>
<providers>
<add
name="Sample Custom Event Provider"
type="Microsoft.Samples.Web.Management.SampleCustomEventProvider, Sample.SampleCustomEventProvider,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx"
/>
</providers>
</healthMonitoring>
設定自訂事件
如果需要自訂健康事件資訊,您可以建置自訂健康事件。如需範例,請參閱HOW TO:實作和引發自訂 ASP.NET 健康監視事件。建立自訂 Web 事件比建立自訂提供者少見。您必須修改組態檔。您也必須在適當的時間明確引發自訂事件。
若要設定事件,您必須執行下列作業:
將自訂健康事件類別加入至 healthMonitoring 區段的 eventMappings 項目。
加入 rules 項目,此項目會定義事件和提供者之間的關聯。
將內含自訂 Web 事件實作之組件,加入至 ASP.NET 應用程式的 Bin 子目錄中。或者,您可以將事件原始程式碼檔案加入至 App_Code 子目錄。
如果要使用組件,則 eventMappings 項目的 type 屬性至少需有類別名稱和組件檔案名稱,如下列程式碼範例所示:
type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent"
如果您使用原始程式碼檔案,就只能指定類別名稱。
下列範例示範如何使 EventLogWebEventProvider 事件提供者和名為 SampleCustomWebEvent 的自訂事件產生關聯。根 Web.config 檔中已經設定 EventLogProvider 事件提供者。
<healthMonitoring
heartBeatInterval="0"
enabled="true">
<rules>
<add
name="Sample Custom Events"
eventName="SampleCustomWebEvent"
provider="EventLogProvider"
profile="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:01:00"
custom=""
/>
</rules>
<eventMappings>
<add
name="SampleCustomWebEvent"
type="System.Web.Management.SampleCustomWebEvent, Sample.SampleCustomWebEvent,Version=1.0.0.0,Culture=neutral, PublicKeyToken=xxxxxxxxxxxx" "
startEventCode="0"
endEventCode="2147483647"
/>
</eventMappings>
</healthMonitoring>
保護 ASP.NET 健康監視
根據預設,ASP.NET 應用程式的健康監視功能為啟用。您可以將 healthMonitoring 項目的 enabled 屬性設定為 false 以停用該功能。預設組態設定會設定為可用的最安全值。如需健康監視組態設定的詳細資訊,請參閱 healthMonitoring 項目 (ASP.NET 設定結構描述)。請考慮使用 location 項目,鎖定健康監視組態設定。
注意事項: |
---|
當您實作自訂事件消費者或自訂事件提供者時,必須編碼或檢查事件內容以避免發生跨站台的指令碼問題。 |
保護組態值安全
當您將機密資訊儲存在應用程式的組態檔中時,應該使用受保護的組態加密機密值。特別機密的資訊包括儲存在 machineKey 組態項目中的加密金鑰,以及儲存在 connectionStrings 組態項目中的資料來源連接字串。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
healthMonitoring 組態區段只能由使用中度信任或更高信任層級的程式碼所存取。這麼做可避免低度信任的應用程式註冊自訂型別。
擴充健康監視的安全性
System.Web.Management 命名空間中的健康監視型別具有下列特性:
基底類別建構函式標示為 protectedinternal。因此,基底類別事件型別的執行個體無法由使用者程式碼直接建立。
存取 Web 事件執行個體限制為組態指定的提供者、篩選和範本網頁。
具有受保護內容之事件上的繼承連結需求會確保只可衍生完全信任的自訂事件。
公開 (Expose) 受保護事件屬性之敏感資料的自訂信任事件,必須自己強制執行程式碼存取安全性,避免引誘攻擊。如需程式碼存取安全性的詳細資訊,請參閱 ASP.NET 程式碼存取安全性或程式碼存取安全性的基本概念。
用於檢視 Web 事件的 Windows Management Instrumentation (WMI) 型別已鎖定,以防止所有使用者存取事件資料。
注意事項: 當您實作自訂事件消費者或自訂事件提供者時,必須編碼或檢查事件內容以避免發生跨站台的指令碼問題。
保護資料來源的連接
您可以建立自訂健康監視事件提供者,將事件資料記錄至資料庫。ASP.NET 包括一個 SQL 提供者。如需如何記錄事件資料的詳細資訊,請參閱設定資料存取的安全性。
若要確保資料庫伺服器的連線,您應該使用受保護的組態以加密組態檔中的連接字串資訊。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
當您使用 SQL 提供者時,必須使用驗證適當的保護資料庫。必須使用存取控制清單 (ACL) 及 SQL 驗證,保護 Microsoft SQL Server Express 版檔案。
注意事項: |
---|
當您記錄事件至資料庫時,SQL Server Express Edition 不應該在未獲權限的帳戶下執行。 |
保護不受阻絕服務攻擊
Web 事件可以由 HTTP 要求或會產生例外狀況或事件的應用程式程式碼觸發。大量事件或大型事件可能會超過事件提供者的容量。在這種情況下,ASP.NET 應用程式或伺服器可能會過度負荷,這可能影響記憶體使用量、磁碟空間及網路流量。
若要降低應用程式面臨阻絕服務攻擊的機會,ASP.NET 預設會使用下列設計:
ASP.NET 每分鐘測量出事件的一個執行個體。這個節流頻率設定在 profiles 項目中,並與 rules 項目中的事件和提供者相關聯。
每個提供者型別的事件緩衝都是隔離的,以防止競爭緩衝區空間。緩衝區設定是在 bufferModes 項目中設定的。指定內含適當設定的 bufferModes 項目,可以將提供者設定為使用特定的緩衝區設定集合。
若要引發自訂事件,需要中度信任或更高的信任。
身為系統管理員,您可以設定節流和緩衝設定以防止溢位,特別是由 HTTP 要求觸發的事件。另外,可以設定不同的緩衝模式,以處理重要和不重要的事件。
錯誤訊息和事件的安全性
若要避免機密資訊公開給不適當的來源,請將應用程式設定為不顯示詳細的錯誤訊息。您也可以設定應用程式,只在用戶端為 Web 伺服器本身時才顯示詳細的錯誤訊息。如需詳細資訊,請參閱 customErrors 項目 (ASP.NET 設定結構描述)。
根據預設,ASP.NET 將大量例外之每一要求的 Web 事件記錄至效能監視系統。在預設組態中,這表示失敗的登入嘗試會將使用者名稱和其他診斷資訊記錄在 [應用程式] 事件記錄檔中。這項資料可以在 Windows 事件檢視器中檢視。如果伺服器執行的是其中一種 Microsoft Windows Server 產品,您可以確保事件記錄的安全以提高應用程式的安全性。您也可以設定參數以指定大小、保留功能及事件記錄的其他特色,以防止受到間接阻絕服務攻擊。
鎖定 ASP.NET 健康監視組態
在應用程式裝載案例中,您通常會想要鎖定網站的某些部分,以免遭人修改。例如,您可能會想要鎖定已裝載應用程式的健康監視設定,以便降低意外修改 Web 應用程式組態的風險。
您可以將 allowOverride="false" 屬性 (Attribute) 加入 <location> 標記 (Tag),藉以鎖定組態設定。如果階層架構中較低層的組態檔嘗試覆寫 location 項目中所定義的任何組態區段,這項設定就會造成組態系統擲回錯誤。
下列範例組態檔示範如何將名為 application1 的 ASP.NET 應用程式之 healthMonitoring 區段鎖定。這項設定可能會儲存在伺服器層級 (在 machine.config 檔案中) 或站台層級。
<configuration>
<location path="application1" allowOverride="false">
<system.web>
<healthMonitoring
enabled="true"
heartBeatInterval="60">
<bufferModes>
<add name="Logging"
maxBufferSize="1000"
maxFlushSize="200"
urgentFlushThreshold="800"
regularFlushInterval="00:30:00"
urgentFlushInterval="00:05:00"
maxBufferThreads="1"
/>
</bufferModes>
<providers>
<add name="EventLogProvider"
type="System.Web.Management.EventLogWebEventProvider, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%"
buffer="true"
bufferMode="Logging"
/>
</providers>
<eventMappings>
<add name="All Errors"
type="System.Web.Management.WebBaseErrorEvent, System.Web, Version=%ASSEMBLY_VERSION%, Culture=neutral, PublicKeyToken=%MICROSOFT_PUBLICKEY%"
/>
</eventMappings>
<profiles>
<add name="Default"
minInstances="1"
maxLimit="Infinite"
minInterval="00:10:00"
/>
</profiles>
<rules>
<add name="All Errors Default"
eventName="All Errors"
provider="EventLogProvider"
profile="Default"
minInterval="00:01:00"
/>
</rules>
</healthMonitoring>
</system.web>
</location>
</configuration>
您可以使用其他屬性,例如 lockItem、lockAttributes 和 lockElements,藉此鎖定更細微的項目。如需詳細資訊,請參閱Section 項目繼承的一般屬性。
回到頁首
程式碼範例
回到頁首
類別參考
System.Web.Management
命名空間,包含管理及監視 Web 應用程式健康狀態的型別。System.Management
命名空間,包含用於連接至 Windows Management Instrumentation (WMI) 基礎結構的型別。System.Management.Instrumentation
命名空間,包含用於檢測 WMI 潛在消費者之應用程式的型別。HealthMonitoringSection
以程式設計方式取得或設定 healthMonitoring 組態屬性的型別。
回到頁首