Как направить ошибку 404 в представление по умолчанию? - PullRequest
1 голос
/ 11 апреля 2019

У меня есть проект в .NET Core 1.1 с архитектурой MVC, и я хочу перенаправить при неправильном URL-адресе (код состояния: 404; не найден), чтобы перенаправить сообщение об ошибке Просмотр, который я уже создал.

В другом проекте с одним контроллером, я сделал так, чтобы он работал правильно:

        [Route ("/Home/Error")]
        public IActionResult Error()
        {
            ViewBag.Title = "About Us";

            return View();
        }
        [Route("/{a}/{*abc}")]
        [HttpGet]
        public IActionResult Err(string a)
        {
            return RedirectToAction("Error", "Home");
        }

и имея при запуске:

app.UseMvc(routes =>
{     routes.MapRoute(
            name: "Default",
            template: "{controller=Home}/{action=GetDocument}/{id?}");
});

Но если в ЭТОМ ПРОЕКТЕ, с 4 контроллерами, с этой конфигурацией при запуске:

 app.UseMvc(routes =>
    {   routes.MapRoute(
             name: "Default",
             template: "{controller}/{action}/{id?}",
             defaults: new { controller = "Home", action = "IndexB" }
          );
     );

и этот код на HomeController или на всех контроллерах (я пробовал оба):

        [Route("/Home/Error")]
        public IActionResult Error()
        {
            ViewBag.Title = "About Us";

            return View();
        }
        [Route("/{a}/{*abc}")]
        [HttpGet]
        public IActionResult Err(string a)
        {
            return RedirectToAction("Error", "Home");
        }

Когда первый код в другом проекте работает как шарм, он идет туда, куда должен идти, но с несуществующим URL-адресом переходит на страницу ошибок.

Но в ЭТОМ ПРОЕКТЕ со вторым кодом меня перенаправляют всегда на страницу ошибок, несмотря ни на что.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Я нашел 2 способа справиться с ошибкой 404. Фактически, используя эти решения, вы можете обрабатывать любые ошибки кода состояния HTTP. Для обработки ошибки оба решения используют метод configure () класса Startup.cs. Для тех, кто не знает о Startup.cs, это точка входа для самого приложения.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseApplicationInsightsRequestTelemetry();
    app.Use(async (context, next) =>
    {
        await next();
        if (context.Response.StatusCode == 404)
        {
            context.Request.Path = "/Home"; 
            await next();
        }
    });

    app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
    app.UseApplicationInsightsExceptionTelemetry();
    app.UseStaticFiles();
    app.UseIdentity();
    // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Раствор 2

Другое решение заключается в использовании встроенного промежуточного программного обеспечения StatusCodePagesMiddleware. Это промежуточное программное обеспечение может использоваться для обработки кода состояния ответа между 400 и 600. Это промежуточное программное обеспечение позволяет возвращать общий ответ об ошибке или позволяет также перенаправить на любое действие контроллера или другое промежуточное программное обеспечение. Смотрите ниже все различные варианты этого промежуточного программного обеспечения.

app.UseStatusCodePages();

Теперь, чтобы обработать ошибку 404, мы будем использовать app.UseStatusCodePagesWithReExecute, который принимает путь, по которому вы хотите перенаправить.

app.UseStatusCodePagesWithReExecute("/Home/Errors/{0}");
public IActionResult Errors(string errCode) 
{ 
  if (errCode == "500" | errCode == "404") 
  { 
    return View($"~/Views/Home/Error/{errCode}.cshtml"); 
  }

  return View("~/Views/Shared/Error.cshtml"); 
}
1 голос
/ 11 апреля 2019

если вы перенаправляете в представление по умолчанию для 404, добавьте пользовательский делегат промежуточного программного обеспечения в Configure метод файла Startup.cs.

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

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
}

Здесь app.Use(async (context, next) => ... - ваш делегат промежуточного программного обеспечения , которыйпроверьте, если ваш код состояния ответа 404, а затем установите путь по умолчанию для перенаправления context.Request.Path = "/home/notfound";.и вы также можете установить вид по умолчанию для других кодов состояния, таких как 500 и т. д.

Я надеюсь, что это поможет вам, и дайте мне знать, если потребуется дополнительная информация.:)

...