本地化和状态页面重新执行导致 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" });
我认为这不是最好的解决方案,但到目前为止它似乎运行良好。
我尝试设置一个 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" });
我认为这不是最好的解决方案,但到目前为止它似乎运行良好。