出于测试目的,我有这种方法:
public ActionResult Index()
{
System.Diagnostics.Debug.Write("Index");
return new HttpNotFoundResult();
}
正在调用该方法(输出'Index')。不知何故,它导致HttpException
被抛出。在我的Global.asax文件中,我有一个Application_Error
实现:
void Application_Error(object sender, EventArgs e)
{
Exception exc = Server.GetLastError();
if (exc is System.Web.HttpException)
{
string msg = "UrlReferrer: "
+ Context.Request.UrlReferrer + " UserAgent: " + Context.Request.UserAgent
+ " UserHostAddress: " + Context.Request.UserHostAddress + " UserHostName: "
+ Context.Request.UserHostName;
ErrorHandler.Error(exc.Message, msg);
}
else {
...
}
}
在系统处理Index
请求后调用此方法。我认为HttpNotFoundResult
会导致抛出异常 - 或者可能会为状态代码为404的任何ActionResult
抛出异常。
这非常令人讨厌,因为它是我的控制器上的OnException
处理程序。对于我的网站,Application_Error
应该是最后一个回退 - 大多数正常错误都是在其他地方(通过控制器或动作过滤器)处理的。我只希望Application_Error
记录完全意外的异常,或者像图像或.js文件那样记录404。
有没有办法阻止asp.net抛出以编程方式生成的404s的异常?或者,有没有办法在Application_Error
中确定HttpException
是否是由编程生成的404引起的?
答案 0 :(得分:2)
您可以创建一个自定义异常过滤器来处理由所有操作引发的404异常。您可以使用HttpContext.Items
集合来跟踪它是否是以编程方式提升的404。
自定义例外过滤器
public class NotFoundExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
// ignore if the exception is already handled or not a 404
if (filterContext.ExceptionHandled || new HttpException(null, filterContext.Exception).GetHttpCode() != 404)
return;
filterContext.HttpContext.Items.Add("Programmatic404", true);
filterContext.ExceptionHandled = true;
}
}
您需要将NotFoundExceptionFilter
应用为全局过滤器。
Application_Error事件
public static void Application_Error(object sender, EventArgs e)
{
var httpContext = ((MvcApplication)sender).Context;
// ignore if it is a programatically raised 404
if(httpContext.Items["Programmatic404"] != null && bool.Parse(httpContext.Items["Programmatic404"].ToString()))
return;
// else, Log the exception
}