[英]IIS 7 Custom Error Page without Web.config
有没有办法在IIS 7中设置自定义错误页面而不创建web.config?
不幸的是,研究这个特定的主题非常困难,因为有很多关于如何使用web.config做的文章。 我正在寻找的是埋藏在我不想要的800万个结果之下,或者它是不可能的。
就在这里。 它涉及订阅Global.asax
的Application_Error
事件或编写自定义的ErrorHandlerAttribute
。
达林已经给出了正确的答案,但我想深入一点。
在任何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就会自动调用它。 但正如这里所说,这并不完美。 特别:
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.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,则无法为所有可能的错误提供最佳用户体验。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.