Повторное выполнение страницы локализации и состояния приводит к 404 вместо страницы ошибки - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь настроить asp.net core 2.0 MVC проект с локализацией в URL и кодовых страницах состояния с повторным выполнением. У меня не получается, и я не знаю, с чего начать отладку.

Проект использует проверку подлинности Windows и авторизуется с помощью групп AD.

Мой Startup.cs выглядит следующим образом (я только выкладываю метод настройки):

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStatusCodePagesWithReExecute("/Error/Index", "?i_statusCode={0}"); //MARKUP 1


        IList<CultureInfo> supportedCultures = new List<CultureInfo>
        {
                new CultureInfo("de"),
                new CultureInfo("it"),
        };


        var localizationOptions = new RequestLocalizationOptions
        {
            DefaultRequestCulture = new RequestCulture("de"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        };
        var requestProvider = new RouteDataRequestCultureProvider();
        localizationOptions.RequestCultureProviders.Insert(0, requestProvider);

        app.UseRouter(routes =>
        {
            routes.MapMiddlewareRoute("{culture=de}/{*mvcRoute}", subApp =>
            {
                subApp.UseRequestLocalization(localizationOptions);

                subApp.UseMvc(mvcRoutes =>
                {
                    mvcRoutes.MapRoute(
                        name: "default",
                        template: "{culture=de}/{controller=Home}/{action=Index}/{id?}");
                });
            });
        });
    }

Примечание. Если я изменю строку MARKUP1 на app.UseStatusCodePages();, все будет работать как положено, но я хочу настроить страницы ошибок.

Мой HomeController.cs выглядит так:

public class HomeController : Controller
{    
        [Authorize(Roles = "NonExistingRole")]
        public IActionResult Index()
        {
            return View();
        }
}

Мой ErrorController.cs выглядит так:

public class ErrorController : Controller
{
    public IActionResult Index(int? i_statusCode=null)
    {
        var feature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();

        ViewBag.StatusCode = i_statusCode;
        ViewBag.OriginalPath = feature?.OriginalPath;
        ViewBag.OriginalQueryString = feature?.OriginalQueryString;

        return View();

    }
}

И My Index.cshtml (расположенный в /Views/Error/) выглядит так:

<p>Status Code: <b>@ViewBag.StatusCode</b></p>
<p>OriginalPath: <b>@ViewBag.OriginalPath</b></p>
<p>OriginalQueryString: <b>@ViewBag.OriginalQueryString</b></p>

Когда я вызываю индексный метод моего домашнего контроллера с авторизацией, все работает как положено. Однако, если у меня нет авторизации, я ожидаю увидеть окно с ошибкой (правильно заполненное) - но вместо этого я просто получаю HTTP 404 (пустая страница).

Я почти уверен, что эта проблема связана с локализацией на маршруте. Потому что, когда я захожу на сайт http://localhost:52288/de/Error/Index?i_statusCode=404 вручную, я вижу страницу с ожидаемой ошибкой. Однако, если я перейду к http://localhost:52288/Error/Index?i_statusCode=404, я также получу пустой HTTP 404 (без страницы / представления).

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я решил это, добавив следующий маршрут ниже моего маршрута по умолчанию в Startup.cs:

mvcRoutes.MapRoute(
                      name: "error",
                      template: "Error/Index",
                      defaults: new { controller = "Error", action = "Index", culture = "de" });

Я не думаю, что это лучшее решение, но пока оно работает довольно хорошо.

0 голосов
/ 02 мая 2018

Вы должны настроить пользовательские страницы ошибок в вашем файле web.config. Например:

<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <clear />
  <error statusCode="404" path="/Erros/Index?statusCode=404" responseMode="ExecuteURL" />

</httpErrors>
</system.webServer>
...