有没有办法在IIS 7中设置自定义错误页面而不创建web.config?
不幸的是,研究这个特定主题非常困难,因为有很多文章介绍了如何使用web.config。我正在寻找的是要么埋没在我不想要的800万个结果之下,要么就是不可能。
答案 0 :(得分:1)
是的,有。它涉及订阅Application_Error
中的Global.asax
事件或撰写自定义ErrorHandlerAttribute
。
答案 1 :(得分:1)
在任何ASP.NET应用程序中,如果它是Web窗体,MVC或原始ASP.NET,您始终可以使用Application_Error
Global.asax。如果您的ASP.NET应用程序没有Global.asax,您只需在解决方案资源管理器中右键单击项目,添加新项,然后选择全局应用程序类。如果您还没有此选项,则应该只有此选项。
在您的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()
处理未捕获的异常。这将为您提供被抛出的Exception
或null
。我不确定如果没有发生异常,为什么会调用这个处理程序,但我相信它是可能的。
要重定向用户,请使用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.CompleteRequest()
。
如果您使用的是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,则无法为所有可能的错误提供最佳用户体验。