c# - HttpNotFoundResult 会导致抛出 HttpException?

标签 c# asp.net asp.net-mvc

为了测试目的,我有这个方法:

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 引发异常。

这非常烦人,因为它回避了我 Controller 上的 OnException 处理程序。对于我的网站,Application_Error 应该是最后的后备方案 - 大多数正常错误旨在在其他地方处理(由 Controller 或操作过滤器)。我只希望 Application_Error 记录完全意外的异常,或者针对图像或 .js 文件等内容记录 404。

有没有办法阻止 ASP.NET 对以编程方式生成的 404 抛出异常?或者,有没有办法在 Application_Error 中确定 HttpException 是否是由编程生成的 404 引起的?

最佳答案

您可以创建自定义异常过滤器来处理所有操作引发的 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
}

关于c# - HttpNotFoundResult 会导致抛出 HttpException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684488/

相关文章:

javascript - Angular 从子组件更新 UI 将值反射(reflect)到父组件

ajax - MVC4 - Ajax.BeginForm 和部分 View 给出 'undefined'

jquery - 类似 Facebook 的灯箱插件,具有照片评论功能

asp.net - ASP.NET 4 中是否可以默认打开 HTML 编码?

c# - WCF SOAP 与 WCF REST 性能对比

c# - 如何从枚举中获取字符串值

c# - 如何实现全局信号量类

asp.net - 如何在 asp.net GridView 的单个文本框中显示 2 个字段的值

c# - ASP.NET Identity - 匿名配置文件

c# - 在 Azure 媒体服务中对不同的宽高比进行编码