gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 404 错误处理

转载 作者:行者123 更新时间:2023-12-02 10:47:05 25 4
gpt4 key购买 nike

Possible Duplicate:
How can I properly handle 404 in ASP.NET MVC?

我已进行 404 Http error handler in Asp.Net MVC (RC 5) 中概述的更改我仍然收到标准 404 错误页面。我需要更改 IIS 中的某些内容吗?

最佳答案

我已经对如何在 MVC(特别是 MVC3)中正确管理 404 进行了大量研究,恕我直言,这是我想出的最佳解决方案:

在 global.asax 中:

public class MvcApplication : HttpApplication
{
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 404)
{
Response.Clear();

var rd = new RouteData();
rd.DataTokens["area"] = "AreaName"; // In case controller is in another area
rd.Values["controller"] = "Errors";
rd.Values["action"] = "NotFound";

IController c = new ErrorsController();
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
}
}

错误 Controller :

public sealed class ErrorsController : Controller
{
public ActionResult NotFound()
{
ActionResult result;

object model = Request.Url.PathAndQuery;

if (!Request.IsAjaxRequest())
result = View(model);
else
result = PartialView("_NotFound", model);

return result;
}
}

编辑:

如果您使用 IoC(例如 AutoFac),您应该使用以下方法创建 Controller :

var rc = new RequestContext(new HttpContextWrapper(Context), rd);
var c = ControllerBuilder.Current.GetControllerFactory().CreateController(rc, "Errors");
c.Execute(rc);

而不是

IController c = new ErrorsController();
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));

(可选)

说明:

我能想到 ASP.NET MVC3 应用程序可以在 6 种情况下生成 404。

由 ASP.NET 生成:

  • 场景 1:URL 与路由表中的路由不匹配。

由 ASP.NET MVC 生成:

  • 场景 2:URL 与路由匹配,但指定的 Controller 不存在。

  • 场景 3:URL 与路由匹配,但指定的操作不存在。

手动生成:

  • 场景 4:操作通过使用 HttpNotFound() 方法返回 HttpNotFoundResult。

  • 场景 5: 操作抛出状态代码 404 的 HttpException。

  • 场景 6:操作手动将 Response.StatusCode 属性修改为 404。

目标

  • (A)向用户显示自定义 404 错误页面。

  • (B) 在客户端响应中维护 404 状态代码(对于 SEO 特别重要)。

  • (C)直接发送响应,不涉及 302 重定向。

解决方案尝试:自定义错误

<system.web>
<customErrors mode="On">
<error statusCode="404" redirect="~/Errors/NotFound"/>
</customErrors>
</system.web>

此解决方案存在的问题:

  • 不符合场景 (1)、(4)、(6) 中的目标 (A)。
  • 不会自动遵守目标 (B)。必须手动编程。
  • 不符合目标 (C)。

解决方案尝试:HTTP 错误

<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="App/Errors/NotFound" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>

此解决方案存在的问题:

  • 仅适用于 IIS 7+。
  • 不符合场景 (2)、(3)、(5) 中的目标 (A)。
  • 不会自动遵守目标 (B)。必须手动编程。

解决方案尝试:替换时出现 HTTP 错误

<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404"/>
<error statusCode="404" path="App/Errors/NotFound" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>

此解决方案存在的问题:

  • 仅适用于 IIS 7+。
  • 不会自动遵守目标 (B)。必须手动编程。
  • 它掩盖了应用程序级别的 http 异常。例如。不能使用customErrors部分、System.Web.Mvc.HandleErrorAttribute等。它不能只显示通用错误页面。

解决方案尝试自定义错误和 HTTP 错误

<system.web>
<customErrors mode="On">
<error statusCode="404" redirect="~/Errors/NotFound"/>
</customError>
</system.web>

<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="App/Errors/NotFound" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>

此解决方案存在的问题:

  • 仅适用于 IIS 7+。
  • 不会自动遵守目标 (B)。必须手动编程。
  • 不符合场景 (2)、(3)、(5) 中的目标 (C)。

以前遇到过这个问题的人甚至尝试创建自己的库(请参阅 http://aboutcode.net/2011/02/26/handling-not-found-with-asp-net-mvc3.html )。但之前的解决方案似乎涵盖了所有场景,而没有使用外部库的复杂性。

关于asp.net-mvc - ASP.NET MVC 404 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717628/

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