Как перенаправить ошибку 404 в представление по умолчанию?

#asp.net #asp.net-mvc #asp.net-mvc-routing

#asp.net #asp.net-mvc #asp.net-mvc-routing

Вопрос:

У меня есть проект в .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-адресом переходит на страницу ошибки.

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

Комментарии:

1. Почему это все еще .NET Core 1.1 ?? Обновите его до 2.2

2. Я прохожу стажировку в компании, и мне нужно это сделать, но я не могу все это изменить, потому что это требует много работы, а у меня нет знаний. @TanvirArjel

Ответ №1:

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

 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) => ... ваш делегат промежуточного программного обеспечения, который проверяет, соответствует ли ваш ответ statuscode 404, а затем задает путь по умолчанию для перенаправления context.Request.Path = "/home/notfound"; . и вы также можете установить представление по умолчанию для других кодов состояния, таких как 500 и т.д.

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

Комментарии:

1. завтра утром на работе я попробую это, спасибо!

2. работает как шарм, я знал, что есть простой способ сделать это, СПАСИБО

Ответ №2:

Я нашел 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. для более подробной информации talkingdotnet.com/handle-404-error-asp-net-core-mvc-6

2. завтра утром на работе я попробую это, спасибо!