本地化和状态页面重新执行导致 404 而不是错误页面

Localisation and Status Page Re-Execution lead to 404 instead of error page

我尝试设置一个 asp.net 核心 2.0 MVC 项目,在 url 中进行本地化并重新执行状态代码页。我没有得到它的工作,我不知道从哪里开始我的调试。

该项目使用Windows身份验证并通过AD组授权。

我的 Startup.cs 看起来像这样(我只 post 配置方法):

 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();

    }
}

我的 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(没有页面/视图)。

您必须在 web.config 文件中设置自定义错误页面。例如:

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

</httpErrors>
</system.webServer>

我通过在 Startup.cs 中的默认路由下面添加以下路由解决了这个问题:

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

我认为这不是最好的解决方案,但到目前为止它似乎运行良好。