Я пытаюсь настроить 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 (без страницы / представления).