没有Web.config的IIS 7自定义错误页面

时间:2012-06-19 18:50:39

标签: asp.net-mvc-3 iis-7 web-config custom-error-handling

有没有办法在IIS 7中设置自定义错误页面而不创建web.config?

不幸的是,研究这个特定主题非常困难,因为有很多文章介绍了如何使用web.config。我正在寻找的是要么埋没在我不想要的800万个结果之下,要么就是不可能。

2 个答案:

答案 0 :(得分:1)

是的,有。它涉及订阅Application_Error中的Global.asax事件或撰写自定义ErrorHandlerAttribute

答案 1 :(得分:1)

达林已经给出了正确答案,但我想深入一点。

在任何ASP.NET应用程序中,如果它是Web窗体,MVC或原始ASP.NET,您始终可以使用Application_Error Global.asax。如果您的ASP.NET应用程序没有Global.asax,您只需在解决方案资源管理器中右键单击项目,添加新项,然后选择全局应用程序类。如果您还没有此选项,则应该只有此选项。 Add new Global Application Class

在您的Global.asax中,如果您还没有看到它,可以添加Application_Error,如下所示:

protected void Application_Error(object sender, EventArgs e) {

}

只要出现错误,ASP.NET就会自动调用它。但正如here所述,这并不完美。具体做法是:

  

仅在Global.asax文件中定义的错误处理程序   捕获ASP.NET处理请求期间发生的错误   运行即可。例如,如果用户请求,它将捕获错误   .aspx文件在您的应用程序中不会出现。 然而,确实如此   如果用户请求不存在的.htm文件,则不会捕获错误。对于   nonASP.NET错误,您可以在Internet中创建自定义处理程序   信息服务(IIS)。 也不会调用自定义处理程序   服务器级错误

Application_Error中,您可以使用Server.GetLastError()处理未捕获的异常。这将为您提供被抛出的Exceptionnull。我不确定如果没有发生异常,为什么会调用这个处理程序,但我相信它是可能的。

要重定向用户,请使用Response.Redirect()。无论您传递的url是什么,都将直接发送到浏览器而无需进一步处理,因此您无法使用应用程序相对路径。为此,我会将此方法与VirtualPathUtility.ToAbsolute()结合使用。例如:

Response.Redirect( VirtualPathUtility.ToAbsolute( "~/Error.aspx" ) );

此重定向将是302(临时重定向)而不是301(永久重定向),这是处理错误时的所需内容。值得注意的是,Response.Redirect的重载与调用重载Response.Redirect(url, endResponse: true)相同。此方法通过抛出异常来工作,这在性能方面并不理想。相反,请立即致电Response.Redirect(url, false),然后再Response.Complete​Request()

如果您使用的是ASP.NET MVC,[HandleError]也是一种选择。将此属性放在Controller上或控制器中的Action上。当此属性存在时,MVC将显示在〜/ Views / Shared文件夹中找到的Error视图。

但是你可以让自己更轻松。您可以通过在项目中创建FilterConfig类来自动添加此属性以调用项目中的控制器。例如:

public class FilterConfig {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
        filters.Add(new HandleErrorAttribute());
    }
}

然后将FilterConfig.RegisterGlobalFilters( GlobalFilters.Filters );添加到Global.asax中的Application_Start()

您可以在https://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute(v=vs.118).aspx了解HandleErrorAttribute的更多信息。

但如上所述,这两种方法都绝不会涵盖处理应用程序期间可能发生的所有错误。如果不使用Web.config或手动配置IIS,则无法为所有可能的错误提供最佳用户体验。