如何在 .NET MVC 3 中实现正确的 HTTP 错误处理

本文关键字:HTTP 处理 错误 实现 NET MVC | 更新日期: 2023-09-27 18:31:42

我指的是Darin在下面的帖子中的回答。

正在使用MVC3,我想知道这是否仍然是处理错误的一种方法?

在 rrror 控制器中,他具有以下内容:

public ActionResult Http404()
{
     Response.StatusCode = 404;
     return Content("404", "text/plain");
}

从他的代码工作..我希望它显示完整的URL,我该怎么做? 所以它需要www.mywebsite.com/Error/Http404,而不仅仅是www.mywebsite.com. 我该怎么做? 我以为如果我有以下代码,那么它将显示完整的URL,但它仍然只显示 www.mywebsite.com:

public ActionResult Http404()
{
     Response.StatusCode = 404;
     return View("Http404");
}

如何获取在 global.asax.cs 中设置的 ex 值以显示在此页面上?

我不再在 web.config 中处理我的错误,因为它保留在查询字符串中有一个 aspxerrorpath。

如何在 .NET MVC 3 中实现正确的 HTTP 错误处理

你试过吗:http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/01/error-handling-and-customerrors-and-mvc3-oh-my.aspx

此示例不会重定向到错误页,但会继续显示发生错误的位置请求的 URL。我希望它能帮助你。

因此,

根据我的理解,您希望将用户重定向到异常的特定错误页面,以及要访问异常的错误页面。

这是我尝试过的,创建了一个基本控制器并覆盖了OnException方法。在OnException方法中,我正在做您在Global.asax.cs中尝试的大部分事情。

最重要的是,在处理异常后,我在ExceptionContextResult属性中设置了一个RedirectAction

同样要从错误视图中访问Exception,我将异常存储在TempData中。从ErrorController,我将异常作为HandleErrorInfo实例传递给视图。

这是完整的代码。

// BaseController
public class BaseController : Controller
{
  protected override void OnException(ExceptionContext filterContext)
  {
    if (!filterContext.ExceptionHandled)
    {
      var action = "General";
      if (filterContext.Exception is HttpException)
      {
        var httpException = filterContext.Exception as HttpException;
        switch (httpException.GetHttpCode())
        {
          case 404:
            // page not found
            action = "Error404";
            break;
          case 500:
            // server error
            action = "Error500";
            break;
          default:
            action = "General";
            break;
        }
      }
      filterContext.Result = RedirectToAction(action, "error");
      TempData["error"] = new HandleErrorInfo(filterContext.Exception, 
                          RouteData.Values["controller"].ToString(), 
                          RouteData.Values["action"].ToString());
      filterContext.ExceptionHandled = true;
    }
  }
}
// Error Controller
public class ErrorController : Controller
{
  public ActionResult Error404()
  {
    return View(TempData["error"] as HandleErrorInfo);      
  }
  // other methods
}
// Sample controller derives from BaseController.
public class HomeController : BaseController
{
  public ActionResult Index()
  {
    return View();
  }
  public ActionResult NotFound()
  {
    throw new HttpException(404, "Not Found");
  }
}
// Error404.cshtml
@model System.Web.Mvc.HandleErrorInfo
@{
  ViewBag.Title = "404 Not Found";
}
<h2>@ViewBag.Title</h2>
<p>
  Last Exception: @Model.Exception
</p>

更新:这种方法的一个缺点是我们可以处理HTTP异常404,500或任何仅从控制器操作中抛出的异常。