Muh*_*eed 8 c# asp.net iis asp.net-core-mvc asp.net-core
我正在使用下面的中间件来为HTTP状态代码400到599设置错误页面。因此访问将/error/400显示400 Bad Request错误页面。
application.UseStatusCodePagesWithReExecute("/error/{0}");
[Route("[controller]")]
public class ErrorController : Controller
{
[HttpGet("{statusCode}")]
public IActionResult Error(int statusCode)
{
this.Response.StatusCode = statusCode;
return this.View(statusCode);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,访问会/this-page-does-not-exist导致出现“未找到IIS 404”的一般错误页面。
有没有办法处理不匹配任何路由的请求?在IIS接管之前,如何处理此类请求?理想情况下,我想将请求转发给/error/404我,以便我的错误控制器可以处理它。
在ASP.NET 4.6 MVC 5中,我们必须使用Web.config文件中的httpErrors部分来执行此操作。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/error/404/" />
</httpErrors>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
Mah*_*ahi 18
我发现的最好的教程之一是:https : //joonasw.net/view/custom-error-pages
总结在这里:
1.首先添加一个控制器,ErrorController然后添加这个动作:
[Route("404")]
public IActionResult PageNotFound()
{
string originalPath = "unknown";
if (HttpContext.Items.ContainsKey("originalPath"))
{
originalPath = HttpContext.Items["originalPath"] as string;
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
注意:您可以将操作添加到另一个现有控制器,如HomeController.
2. 现在添加PageNotFound.cshtml视图。像这样的东西:
@{
ViewBag.Title = "404";
}
<h1>404 - Page not found</h1>
<p>Oops, better check that URL.</p>
Run Code Online (Sandbox Code Playgroud)
3. 重要的部分在这里。将此代码添加到Startup类的内部Configure方法中:
@{
ViewBag.Title = "404";
}
<h1>404 - Page not found</h1>
<p>Oops, better check that URL.</p>
Run Code Online (Sandbox Code Playgroud)
请注意,它必须在路由配置之前添加,例如app.UseEndpoints....
您可以在 asp.net core 中的 EndPoint 中使用回退如下(在 app.UseEndpoints 内)和剃刀页面(NotFound 是页面文件夹中的剃刀页面而不是控制器)
endpoints.MapRazorPages();
endpoints.MapFallback( context => {
context.Response.Redirect("/NotFound");
return Task.CompletedTask;
});
Run Code Online (Sandbox Code Playgroud)
基于此SO项,IIS在到达404之前先获取404(并对其进行处理)UseStatusCodePagesWithReExecute。
您是否尝试过:https : //github.com/aspnet/Diagnostics/issues/144?它建议终止接收到404的请求,以使它不会转到IIS进行处理。这是添加到启动中的代码:
app.Run(context =>
{
context.Response.StatusCode = 404;
return Task.FromResult(0);
});
Run Code Online (Sandbox Code Playgroud)
这似乎是一个仅限IIS的问题。
| 归档时间: |
|
| 查看次数: |
12947 次 |
| 最近记录: |