而不是獲得HTTP 404響應,我想有一個通用的404 Not Found頁面(HTTP 200)。我知道你可以設置最多的MVC 5MVC 6 404沒有找到
<customErrors mode="On">
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
但我似乎無法弄清楚如何做到這一點的MVC 6.我猜應該是無論是在UseMvc路由表,或一個定製的中間件。
而不是獲得HTTP 404響應,我想有一個通用的404 Not Found頁面(HTTP 200)。我知道你可以設置最多的MVC 5MVC 6 404沒有找到
<customErrors mode="On">
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
但我似乎無法弄清楚如何做到這一點的MVC 6.我猜應該是無論是在UseMvc路由表,或一個定製的中間件。
Startup.cs:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
// PICK YOUR FLAVOR.
// app.UseErrorPage(ErrorPageOptions.ShowAll);
app.UseStatusCodePages(); // There is a default response but any of the following can be used to change the behavior.
// app.UseStatusCodePages(context => context.HttpContext.Response.SendAsync("Handler, status code: " + context.HttpContext.Response.StatusCode, "text/plain"));
// app.UseStatusCodePages("text/plain", "Response, status code: {0}");
// app.UseStatusCodePagesWithRedirects("~/errors/{0}"); // PathBase relative
// app.UseStatusCodePagesWithRedirects("/base/errors/{0}"); // Absolute
// app.UseStatusCodePages(builder => builder.UseWelcomePage());
// app.UseStatusCodePagesWithReExecute("/errors/{0}");
}
}
project.json:
"dependencies": {
"Microsoft.AspNet.Diagnostics": "1.0.0-*",
// ....
}
需要注意的是,如果你在IIS(或天藍色)託管,該web.config
做仍然有效,它的大可能需要在一些託管方案。 (它應該放在wwwroot
文件夾
我試過使用'''UseStatusCodePagesWithReExecute''',它不處理404到'''/這個頁面不存在''。 – 2015-07-24 13:37:53
@MuhammadRehanSaeed'app.UseStatusCodePagesWithReExecute(「/ Home/Error/{0}」);'在beta8中工作。 – 2015-11-19 07:48:11
只需要提一下,截至目前1.1.0版本,似乎沒有'UseErrorPage()'擴展方法 – superjos 2017-01-02 19:47:54
有一個名爲StatusCodePagesMiddleware
的中間件,我相信它是在Beta3之後添加的。
樣品:https://github.com/aspnet/Diagnostics/blob/dev/samples/StatusCodePagesSample/Startup.cs
我認爲這是診斷,但我不確定。 – 2015-04-08 06:35:50
我試過使用'UseStatusCodePagesWithReExecute'',它不處理404到''/ this-page-does-exist'''。 – 2015-07-24 13:38:15
內部在啓動類的配置功能,來電:
app.UseErrorPage(ErrorPageOptions.ShowAll);
更多的生產準備:
if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
{
app.UseBrowserLink();
app.UseErrorPage(ErrorPageOptions.ShowAll);
app.UseDatabaseErrorPage(DatabaseErrorPageOptions.ShowAll);
}
else
{
// Add Error handling middleware which catches all application specific errors and
// send the request to the following path or controller action.
app.UseErrorHandler("/Home/Error");
}
您可以處理404錯誤與UseStatusCodePagesWithReExecute
但您需要首先在您的配置管道的末端設置狀態代碼。
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler();
if (string.Equals(_env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
{
app.UseDeveloperExceptionPage();
app.UseRuntimeInfoPage();
} else
{
app.UseExceptionHandler("/Error");
}
app.UseStatusCodePagesWithReExecute("/Error/Status/{0}");
app.UseStaticFiles();
app.UseMvc();
app.Use((context, next) =>
{
context.Response.StatusCode = 404;
return next();
});
}
如果管道中沒有任何東西可以處理它(這是你想要的),這會將狀態碼設置爲404。
然後,您可以在控制器中輕鬆捕獲和處理響應。
[Route("error")]
public class ErrorController : Controller
{
[Route("Status/{statusCode}")]
public IActionResult StatusCode(int statusCode)
{
//logic to generate status code response
return View("Status", model);
}
}
感謝!但是在我的測試中,我並不需要在啓動時404(使用Core 1.0) – Sean 2016-07-21 16:17:22
如果你有一個標準的5 ASP.NET Web應用程序模板項目,你可以得到一個非常好的解決方案,同時處理保持錯誤狀態代碼,同時爲您服務您所選擇的CSHTML文件。
Startup.cs
,在Configure
方法
替換
app.UseExceptionHandler("/Error");
與
app.UseStatusCodePagesWithReExecute("/Home/Errors/{0}");
然後取出全部接收如下:
app.Run(async (context) =>
{
var logger = loggerFactory.CreateLogger("Catchall Endpoint");
logger.LogInformation("No endpoint found for request {path}", context.Request.Path);
await context.Response.WriteAsync("No endpoint found - try /api/todo.");
});
在HomeController.cs
替換當前Error
方法具有以下之一:
public IActionResult Errors(string id)
{
if (id == "500" | id == "404")
{
return View($"~/Views/Home/Error/{id}.cshtml");
}
return View("~/Views/Shared/Error.cshtml");
}
這樣,你可以添加錯誤文件,您覺得用戶可以從中受益(而搜索引擎和這樣仍然得到正確的狀態代碼)
現在在~Views/Home
文件夾中添加一個名爲Error
的文件夾 創建兩個.cshtml
文件。命名第一個404.cshtml
,第二個500.cshtml
。
給他們一些有用的內容,並啓動應用程序,並寫入類似http://localhost:44306/idonthaveanendpointhere
,並確認安裝工程。
也可以按F12開發人員工具,並確認狀態代碼爲404。
如果有人希望創建HTML定製404頁面,你可以這樣做:
Startup.cs
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseStatusCodePagesWithReExecute("/errors/{0}");
}
}
project.json
"dependencies": {
"Microsoft.AspNet.Diagnostics": "1.0.0-*",
// ....
}
ErrorsController.cs
public class ErrorsController : Controller
{
// ....
[Route("/Error/{statusCode}")]
public IActionResult ErrorRoute(string statusCode)
{
if (statusCode == "500" | statusCode == "404")
{
return View(statusCode);
}
return View("~/Views/Errors/Default.cshtml");
}
}
所有剩下的這之後是創建一個404.cshtml,500.cshtml和Default.cshtml在你的錯誤查看文件夾和自定義HTML根據自己的喜好。
在管道末尾捕獲「/ errors/{0}」(複數「錯誤」),並且在屬性' [Route(「/ Error/{statusCode}」)]'(單數「錯誤」)。它不會工作。 – 2017-04-27 11:22:19
從來沒有這樣做,但我很好奇什麼是不同的,這似乎是有道理的:http://benfoster.io/blog/aspnet-mvc-custom-error-pages在一個令人費解的方式。 – RandomUs1r 2015-04-02 19:48:58
是不是''不工作?看看我的答案在這裏(如果它是相關的):http://stackoverflow.com/questions/28989026/how-do-i-catch-the-http-status-code-of-server-errors-into-a- generic-custom-error/28991628#28991628 如果你使用的是IIS7 +,那麼''是通過web配置和自定義視圖捕獲和處理404等的更好方法。 –
scgough
2015-04-03 07:26:45