自定义 ASP.NET MVC 404错误页面的路由

我试图使一个自定义的 HTTP404错误页面时,有人键入一个 URL 它不会在 ASP.NET MVC 中调用有效的操作或控制器,而是显示通用的“ Resource Not Found”ASP.NET 错误。

I don't want to use the web.config to handle this.

有没有什么路由魔法可以让我捕捉到任何无效的 URL?

更新: 我尝试了给出的答案,但我还是得到了难看的“资源未找到”信息。

另一个更新: 好的,显然 RC1发生了一些变化。我甚至尝试过在 HttpException上特别设置404,但它仍然只给我“资源未找到”的页面。

I've even used MvcContrib's resource's feature and nothing - same problem. Any ideas?

167524 次浏览

只需在路由表的末尾添加 catch all path 并显示您想要的任何页面。

见: 我怎样才能使一个赶上所有的路线来处理’404页面未找到’查询 ASP.NET MVC?

我通过创建一个 ErrorController 来执行错误处理,它返回本文中的视图。我还必须在 global.asax 中添加“ Catch All”路由。

如果它不在 Web.config 中,我看不到它将如何到达这些错误页面中的任何一个。.?我的 Web.config 必须指定:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

然后我又加了一句:

error statusCode="404" redirect="~/Error/NotFound"

我也有同样的问题,你需要做的是,不要在视图文件夹中的 web.config 文件中添加 customError 属性,而是把它添加到项目根文件夹中的 web.config 文件中

我已经尝试在生产服务器上启用自定义错误3个小时,似乎我找到了最终的解决方案,如何在 ASP.NET MVC 没有任何路由这样做。

要在 ASP.NET MVC 应用程序中启用自定义错误,我们需要(IIS7 +) :

  1. system.web部分的 web 配置中配置自定义页面:

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
    <error statusCode="404" redirect="~/error/Error404" />
    <error statusCode="500" redirect="~/error" />
    </customErrors>
    

    RemoteOnly意味着在本地网络上你会看到真正的错误(在开发过程中非常有用)。我们还可以为任何错误代码重写错误页面。

  2. 设置魔法响应参数和响应状态代码(在错误处理模块或错误处理属性中)

      HttpContext.Current.Response.StatusCode = 500;
    HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. Set another magic setting in web config under system.webServer section:

    <httpErrors errorMode="Detailed" />
    

This was final thing that I've found and after this I can see custom errors on production server.

在 web.config 中尝试替换 IIS 错误页面。我认为这是最好的解决方案,而且它还会发送正确的状态代码。

<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="404" path="Error404.html" responseMode="File" />
<error statusCode="500" path="Error.html" responseMode="File" />
</httpErrors>
</system.webServer>

来自 Tipila-使用自定义错误页面 ASP.NET MVC的更多信息

来源

NotFoundMVC -当 ASP.NET MVC3应用程序中没有找到控制器、操作或路由时,提供一个用户友好的404页面。 呈现一个名为 NotFound 的视图,而不是默认的 ASP.NET 错误页面。

你可以通过 nuget 添加这个插件: Install-Package NotFoundMvc

NotFoundMvc 在 Web 应用程序启动期间自动安装自己。它处理 ASP.NET MVC 通常抛出404 HttpException 的所有不同方式。这包括缺少控制器、操作和路由。

Step by Step Installation Guide :

1-右键单击您的项目,并选择管理 Nuget 软件包..。

2-搜索 NotFoundMvc并安装它。 enter image description here

一旦安装完成,两个文件将添加到您的项目。如下面的截图所示。

enter image description here

4-打开视图/共享中新添加的 NotFound.cshtml,并根据自己的意愿修改它。现在运行应用程序并输入一个不正确的 URL,您将看到一个用户友好的404页面。

enter image description here

再也不会有像 Server Error in '/' Application. The resource cannot be found.这样的错误消息了

希望这对你有帮助:)

附注: 赞美 Andrew Davey制作了这么棒的插件。

这个解决方案不需要更改 web.config 文件或捕获所有路由。

First, create a controller like this;

public class ErrorController : Controller
{
public ActionResult Index()
{
ViewBag.Title = "Regular Error";
return View();
}


public ActionResult NotFound404()
{
ViewBag.Title = "Error 404 - File not Found";
return View("Index");
}
}

然后在“视图/错误/Index.cshtml”下创建视图,如下所示;

 @{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<p>We're sorry, page you're looking for is, sadly, not here.</p>

Then add the following in the Global asax file as below:

protected void Application_Error(object sender, EventArgs e)
{
// Do whatever you want to do with the error


//Show the custom error page...
Server.ClearError();
var routeData = new RouteData();
routeData.Values["controller"] = "Error";


if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
{
routeData.Values["action"] = "Index";
}
else
{
// Handle 404 error and response code
Response.StatusCode = 404;
routeData.Values["action"] = "NotFound404";
}
Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
IController errorsController = new ErrorController();
HttpContextWrapper wrapper = new HttpContextWrapper(Context);
var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
errorsController.Execute(rc);


Response.End();
}

如果执行此操作后仍然得到自定义 IIS 错误页面,请确保在 web 配置文件中注释掉(或空)以下部分:

<system.web>
<customErrors mode="Off" />
</system.web>
<system.webServer>
<httpErrors>
</httpErrors>
</system.webServer>

如果你在 MVC 4工作,你可以看 这个解决方案,它为我工作。

将下面的 Application _ Error 方法添加到我的 Global.asax:

protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();


RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "Index");
routeData.Values.Add("exception", exception);


if (exception.GetType() == typeof(HttpException))
{
routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
}
else
{
routeData.Values.Add("statusCode", 500);
}


IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
Response.End();

控制器本身非常简单:

public class ErrorController : Controller
{
public ActionResult Index(int statusCode, Exception exception)
{
Response.StatusCode = statusCode;
return View();
}
}

检查 GitHub 上的 Mvc4CustomErrorPage的完整源代码。

这里是真正的答案,允许完全自定义的错误页面在单一的地方。 不需要修改 web.config 或创建单独的代码。

Works also in MVC 5.

将此代码添加到控制器:

        if (bad) {
Response.Clear();
Response.TrySkipIisCustomErrors = true;
Response.Write(product + I(" Toodet pole"));
Response.StatusCode = (int)HttpStatusCode.NotFound;
//Response.ContentType = "text/html; charset=utf-8";
Response.End();
return null;
}

基于 http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages

I will talk about some specific cases,

如果你在 HomeController 中使用“ PageNotfound 方法”,请按以下方式进行操作

[Route("~/404")]
public ActionResult PageNotFound()
{
return MyView();
}

但是你必须清除下面的路由标签,

//[Route("~/404")]
public ActionResult PageNotFound()
{
return MyView();
}

如果在 web.config < strong > 中将其更改为方法 Name,则可以正常工作。 但是不要忘记像下面这样在 web.config 中编写代码

<customErrors mode="On">
<error statusCode="404" redirect="~/PageNotFound" />
*// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>