我尝试设置一个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(没有页面/视图)。
答案 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" });
我不认为这是最好的解决方案,但到目前为止似乎工作得很好。