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

时间:2018-05-02 11:59:19

标签: c# asp.net-mvc asp.net-core-2.0 http-status-codes

我尝试设置一个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();

    }
}

我的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 :(得分:0)

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

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

</httpErrors>
</system.webServer>

答案 1 :(得分:0)

我通过在Startup.cs

中的默认路线下添加以下路线解决了这个问题
mvcRoutes.MapRoute(
                      name: "error",
                      template: "Error/Index",
                      defaults: new { controller = "Error", action = "Index", culture = "de" });

我不认为这是最好的解决方案,但到目前为止似乎工作得很好。