如何显示自定义404错误页面

时间:2018-07-23 09:12:54

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

我已经创建了一个演示用于在MVC 5中显示我们的自定义错误页面。输入两个斜杠时我成功了,但是当我输入两个以上斜杠时,我没有得到我的自定义错误页面,而是一个MVC错误,如下所示。

  

HTTP错误404.0-找不到所需的资源已被删除,名称已更改或暂时不可用。

这是我的Web.config文件的样子。

<customErrors mode="On" defaultRedirect="~/Error">
    <error redirect="~/Error/NotFound" statusCode="404" />
    <error redirect="~/Error/Forbidden" statusCode="403" />
</customErrors>

这是我的ErrorController

public ViewResult NotFound()
{
    return View();
}

当我在下面输入URL时,我当前的设置工作正常。

  

http://localhost:14360/search/fdsfdf

但是,当您输入以下网址之一时,不会显示我的自定义错误页面。

  

http://localhost:14360/search/fdsfdf/sdsdsd/asdsadasd/dasdsad
  http://localhost:14360/search/fdsfdf/dsads/fe

2 个答案:

答案 0 :(得分:1)

您面临的问题归结为以下事实:某些错误由ASP.NET处理,而其他错误由IIS处理。您可以阅读有关该主题here的更多信息。

我建议您创建一个.collect,该ErrorsController处理最常见的应用程序错误并返回相应的视图。此外,您必须将Web.config(或Web.Release.config)文件配置为使用新创建的控制器,并且可能还必须替换IIS的默认错误页面(对我来说,它们位于InetPub\custerr\en-US\目录。

控制器 (ErrorsController.cs)

public class ErrorsController : Controller
{
    // GET: Errors/Unauthorized
    public ActionResult Unauthorized()
    {
        return new HttpStatusCodeResult(401);
    }

    // GET: Errors/Forbidden
    public ActionResult Forbidden()
    {
        return new HttpStatusCodeResult(403);
    }

    // Additional Errors
}

配置文件 (Web.Release.config)

<customErrors defaultRedirect="~/" mode="RemoteOnly" xdt:Transform="Replace">
  <error statusCode="401" redirect="~/Errors/Unauthorized"/>
  <error statusCode="403" redirect="~/Errors/Forbidden"/>
  <!-- Additional Errors -->
</customErrors>

答案 1 :(得分:1)

默认/App_Start/RouteConfig.cs拥有

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

因此您输入http://localhost:14360/search/fdsfdfhttp://localhost:14360/search/fdsfdf/1234将获得httpStatusCode 200,但是http://localhost:14360/search/fdsfdf/dsads/fe是未定义的URL,asp.net将向浏览器返回404 如果您需要自定义错误页面,请尝试添加httpErrorscustomErrors处理httpStatusCode 404

<system.webServer>
    <httpErrors existingResponse="Auto" errorMode="Custom" defaultResponseMode="File">
        <remove statusCode="404" subStatusCode="-1"/>
        <error statusCode="404" path="/Error/404" responseMode="Redirect" />
    </httpErrors>
</system.webServer>

<system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="~/Error/Index">
        <error redirect="~/Error/404" statusCode="404" />
    </customErrors>
</system.web>