gpt4 book ai didi

c# - HttpNotFoundResult 导致抛出 HttpException?

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:53 26 4
gpt4 key购买 nike

出于测试目的,我有这个方法:

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 或 Action 过滤器)。我只希望 Application_Error 记录完全意外的异常,或 404 错误,例如图像或 .js 文件。

有没有办法阻止 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com