神奇的独角兽ASP.NET MVC自定义错误页(ASP.NET MVC Custom Error P

2019-07-03 11:58发布

我的问题是关于Pure.Kromes回答这个职位 。 我试着用他的方法实现我的页面自定义错误消息,但也存在一些问题我不能完全解释。

一)当我在无效的网址进入例如localhost招来404错误:3001 / NonexistantPage,则默认为我的错误控制器的SERVERERROR()动作,即使它应该去NOTFOUND()。 这里是我的ErrorController:

    public class ErrorController : Controller
    {
        public ActionResult NotFound()
        {
            Response.TrySkipIisCustomErrors = true;
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            var viewModel = new ErrorViewModel()
            {
                ServerException = Server.GetLastError(),
                HTTPStatusCode = Response.StatusCode
            };
            return View(viewModel);
        }

        public ActionResult ServerError()
        {
            Response.TrySkipIisCustomErrors = true;
            Response.StatusCode = (int)HttpStatusCode.InternalServerError;

            var viewModel = new ErrorViewModel()
            {
                ServerException = Server.GetLastError(),
                HTTPStatusCode = Response.StatusCode
            };
            return View(viewModel);
        }
    }

在Global.asax.cs中我的错误路线:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

        routes.MapRoute(
            name: "Error - 404",
            url: "NotFound",
            defaults: new { controller = "Error", action = "NotFound" }
            );

        routes.MapRoute(
            name: "Error - 500",
            url: "ServerError",
            defaults: new { controller = "Error", action = "ServerError" }
            );


而我的web.config设置:

<system.web>
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/ServerError">
    <error statusCode="404" redirect="/NotFound" />
</customErrors>
...
</system.web>

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...

错误观点都位于/浏览/错误/如NotFound.cshtml和ServerError.cshtml。

b)一名有趣的是,当一台服务器出现错误,但它其实显示我定义的服务器错误观点,但是它也输出一个默认的错误消息也说,错误页面无法找到。

下面是它的样子:


你有什么建议,我怎么能解决这两个问题? 我真的很喜欢Pure.Kromes方法来实施这些错误消息,但如果有实现这一毫不犹豫地告诉我更好的办法。

谢谢!

**编辑:**我可以直接通过访问/错误/ NOTFOUND或错误/ SERVERERROR导航通过ErrorController自己的看法。

视图自身仅包含一些文本,无标记或任何东西。

正如我所说的,它确实可以工作在某种程度上,只是没有办法,我打算它的工作。 似乎与在web.config重定向一个问题,但我一直没能弄明白。

Answer 1:

还有一个问题与安装程序,当你有更复杂的路线,有几个段前。

http://localhost:2902/dsad/dadasdmasda/ddadad/dadads/ddadad/dadadadad/

我得到了服务器错误 - >

Sorry, an error occurred while processing your request.


Exception: An error occured while trying to Render the custom error view which you provided, for this HttpStatusCode. ViewPath: ~/Views/Error/NotFound.cshtml; Message: The RouteData must contain an item named 'controller' with a non-empty string value.
Source: 

我该解决方案是在默认路由后,最后添加附加路由

        routes.MapRoute(
            "Default Catch all 404",
            "{controller}/{action}/{*catchall}",
            new { controller = "Error", action = "NotFound" }
        );

希望它可以帮助别人:-)



Answer 2:

我得到它的工作。 看来我对问题的理解是有些错误的开始。

在web.config中,我改变了以下内容:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/ServerError.cshtml">
  <error statusCode="404" redirect="~/Views/Error/NotFound.cshtml" />
</customErrors>

......然后......

<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
    </httpErrors>

这直接重定向到的意见。 我的理解是,我不得不重定向到错误控制这反过来会重定向到的意见,但显然这并非如此。 我要感谢你的意见,因为他们已经让我再分析这个问题时,我已经快要刚刚沟自定义错误的东西,只是偷懒,显示YSOD的。 :)



文章来源: ASP.NET MVC Custom Error Pages with Magical Unicorn