【发布时间】:2020-03-27 07:26:44
【问题描述】:
在尝试为返回 NotFound 结果的页面请求显示自定义 404 错误页面时,我在 dotnet razor pages Web 应用程序中遇到了 UseStatusCodePagesWithReExecute 问题。具体来说,如果我从 OnGet 方法返回 NotFound,我会发现再次调用了相同的请求,并且永远不会重新执行提供给中间件的路径。
我使用的是 .NET Core 3.0,所以没有尝试过以前的版本或 3.1 预览版。
我已经设法通过一个简单的重现来复制问题。以下将允许无效路由重定向到错误页面(例如https://localhost:5001/foo),但是路由https://localhost:5001/ 将被调用两次并且不会重定向到错误页面。
所以我要问的问题是,这是一个错误还是我在这里遗漏了一些概念?我已经尝试过相关的 UseStatusCodePagesWithRedirects 方法,它确实按照它说的去做,但如果可以的话,我真的很想使用 ReExecute。
复制
环境:
- Windows 10
- dotnet 核心 3.0
- chrome 和 edge 浏览器(未尝试过其他浏览器)- 无论如何都不要认为这是浏览器问题,因为没有重新提交。
步骤:
- 创建模板剃须刀项目
dotnet new webapp -n myapp。 - 编辑
Index.cshtml.csOnGet方法如下:
public IActionResult OnGet()
{
return NotFound();
}
- 编辑
Startup.cs并在 Configure 方法中的 if/else 代码块之后添加app.UseStatusCodePagesWithReExecute("/Error");,如下所示:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
// Added this line
app.UseStatusCodePagesWithReExecute("/Error");
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
- 在 OnGet 的第一行放置一个断点(假设是 VSCode 或 Visual Studio 2019)。
- 在第一个请求之后运行调试和 F5 到索引页面。不会重定向到
/Error,而是再次命中断点。 - 再次按 F5,浏览器会显示其标准 404 而不是错误页面。
提前致谢。
【问题讨论】: