2012-03-20 68 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