关于c#:如何在-ASPNET-Core-中处理-404-错误

31次阅读

共计 2597 个字符,预计需要花费 7 分钟才能阅读完成。

译文链接:https://www.infoworld.com/art…

asp.net core mvc 对应着 .NET Framework 中的 ASP.NET MVC, 前者能够跨平台,可扩大,高性能,不过令人诧异的是,尽管 ASP.NET Core 提供了大量的可选项能够完满的解决 404 谬误,但 ASP.NET Core MVC 在默认状况下并没有抉择它们,你说奇怪不?

这就造成了当申请一个不存在的页面时,应用程序将会返回一个 404 谬误,ASP.NET Core MVC 目前会展现一个浏览器通用的谬误页,如下图所示:

这篇文章我筹备探讨 3 种 形式来优雅的解决这种 404 谬误。

接下来我会在 Visual Studio 2019 中创立一个 ASP.NET Core MVC 我的项目,用这个我的项目去展现如何解决 404 谬误。

而后把 ASP.NET Core MVC 我的项目跑起来,你会看到应用程序默认的首页,下面还带一行 welcome 的欢送语????,如下图所示:

接下来咱们尝试在浏览器中输出一个不存在的网址,比如说:http://localhost:6440/welcome, 这时候 ASP.NET Core MVC 引擎将会拜访这个地址的资源,可想而知,引擎必定会返回一个 404 谬误,你也会看到如下谬误页,通常状况下这是十分让人难堪的,对吧。

查看 ASP.NET Core MVC 的 Response.StatusCode

有几种形式能够比拟完满的解决这种默认的 404 谬误,一个简略的计划就是去查看 response 的 http 状态码,一旦发现这个 status = 404,你能够重定向到一个 web 中存在的页面或者一个特定的谬误页,上面的代码展现了,你能够在 Startup.Configure 办法中进行全局判断,一旦发现 404 谬误就导向 home 页面。


    public class Startup
    {public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {app.Use(async (context, next) =>
            {await next();
                if (context.Response.StatusCode == 404)
                {
                    context.Request.Path = "/Home";
                    await next();}
            });
        }
    }

接下来运行 web 程序,而后键入 http://localhost:6440/welcome, 你会发现最终展现了 home 页面。

上面是 Configure 办法的残缺代码。


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {if (env.IsDevelopment())
            {app.UseDeveloperExceptionPage();
            }
            else
            {app.UseExceptionHandler("/Home/Error");
            }
            app.Use(async (context, next) =>
            {await next();
                if (context.Response.StatusCode == 404)
                {
                    context.Request.Path = "/Home";
                    await next();}
            });
            app.UseStaticFiles();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

应用 UseStatusCodePages 中间件

第二种可选的解决方案是,采纳 ASP.NET Core 中内置的 UseStatusCodePages 中间件,上面的代码展现了如何在 Startup.Configure 办法中去实现 StatusCodePages。


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {app.UseStatusCodePages();
            //Other code
        }

当初你能够把程序跑起来而后浏览一下这个不存在的资源,下图展现了这种状况下的输入后果:

应用 UseStatusCodePagesWithReExecute 中间件

你能够利用 UseStatusCodePagesWithReExecute 中间件来解决 那种 Response 还没开始构建 就遇到的一些不胜利的状态,有点绕哈,因而这个中间件不会解决 Response status 等于 404 的状况,当 404 产生的时候,这个中间件要做的就是将 request 重定向到另外一个 Action 去解决这个谬误。

上面的代码展现了如何应用这个中间件将 request 重定向到另外一个 action 办法。


app.UseStatusCodePagesWithReExecute("/Home/HandleError/{0}");

而后再来看一下被重定向的 Action 办法。


[Route("/Home/HandleError/{code:int}")]
public IActionResult HandleError(int code)
{ViewData["ErrorMessage"] = $"Error occurred. The ErrorCode is: {code}";
   return View("~/Views/Shared/HandleError.cshtml");
}

当初我把展现错误信息的 HandleError 视图的创立留给你去实现吧!????

最初,你可能想为一些错误码创立一些特定的 view,比如说,你能够创立 Home/Error/500.cshtml 或者 Home/Error/404.cshtml 视图,而后依据 http status code 的值重定向到适合的谬误页。

另外一种解决 404 谬误的形式是应用一个自定义的页面,而后在页面上设置一些特定的错误代码,这样也不便暗藏一些比拟重要的信息,比方将 404 改成 服务压力大,请分割管理员 等等,一旦应用程序产生谬误,你能够将用户导向你设置的谬误页,而后展现你设置的错误信息。

更多高质量干货:参见我的 GitHub: dotnetfly

正文完
 0