2012-03-20 33 views
1

對於網站/ vpath,可以處理Application_Error事件以在錯誤返回給瀏覽器之前發現錯誤。不知怎的,是否可以在服務器級別執行此操作?也就是說,如果在網站中發生錯誤,則會在根級別定義一個方法,但該網站無論出於何種原因都無法處理錯誤。如何在服務器級別定義錯誤處理邏輯

我知道你可以在根級別使用web.config來定義每個HTTP狀態碼的自定義錯誤消息。但是,這對我的情況並不理想,因爲我想根據應用程序邏輯返回不同類型的內容(即HTML或其他內容)。

回答

1

自定義http模塊可以在applicationHost.config註冊。然後,此模塊由目標機器上的所有IIS應用程序使用。

1)創建HTTP模塊簽署的類庫項目:

public class ErrorHandlingModule : IHttpModule 
{ 
    public void Dispose() { } 

    public void Init(HttpApplication context) 
    { 
     context.Error += new EventHandler(context_Error); 
    } 

    void context_Error(object sender, EventArgs e) 
    { 
     // handle error 
    } 
} 

2)Install類庫到GAC,因此它可以通過共享所有IIS應用程序。

3)Install將http模塊複製到applicationHost.config文件。這個文件通常位於C:\ Windows \ System32 \ inetsrv \ config中。此文件夾中的文件只能被64位進程訪問(在32位操作系統上沒有這種問題),但VS2010無法看到它們,但Explorer可以訪問。 applicationHost.config片段可能如下所示:

<location path="" overrideMode="Allow"> 
    <system.webServer> 
     <modules> 
      <add name="MyModule" preCondition="managedHandler" type="GlobalErrorHandler.ErrorHandlingModule, GlobalErrorHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bfd166351ed997df" /> 
+0

謝謝,這正是我一直在尋找的!一個後續問題,如果你不介意的話:如果我有這個模塊,並且還處理Global.asax中的Application_Error,它將首先被調用? – McGarnagle 2012-03-27 07:37:46

+0

很高興幫助。在我的情況下,http模塊首先被調用。但我不認爲至少我找不到任何提及應用程序的事件處理程序執行順序的文檔。請讓我知道,如果你發現有關這個話題:)。 – 2012-03-27 08:46:03

0

我不清楚你的問題是什麼,但根據我的理解。在application_error裏面你可以使用,

Server.GetLastError() to get last error occured in server level. 
+0

爲了清楚起見,更新了問題。我的問題是,你是否可以有一個代碼塊來捕捉網站無法捕捉的任何錯誤。對於整個服務器來說,這非常有效,就像global.asax application_on_error一樣,而不是針對每個單獨的應用程序。 – McGarnagle 2012-03-20 04:52:49

+0

我認爲你只能在事件viwer中看到。 – 2012-03-21 06:46:11