2015-04-02 97 views
9

而不是獲得HTTP 404響應,我想有一個通用的404 Not Found頁面(HTTP 200)。我知道你可以設置最多的MVC 5MVC 6 404沒有找到

<customErrors mode="On"> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
</customErrors> 

但我似乎無法弄清楚如何做到這一點的MVC 6.我猜應該是無論是在UseMvc路由表,或一個定製的中間件。

+1

從來沒有這樣做,但我很好奇什麼是不同的,這似乎是有道理的:http://benfoster.io/blog/aspnet-mvc-custom-error-pages在一個令人費解的方式。 – RandomUs1r 2015-04-02 19:48:58

+0

是不是''不工作?看看我的答案在這裏(如果它是相關的):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

回答

13

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文件夾

+0

我試過使用'''UseStatusCodePagesWithReExecute''',它不處理404到'''/這個頁面不存在''。 – 2015-07-24 13:37:53

+1

@MuhammadRehanSaeed'app.UseStatusCodePagesWithReExecute(「/ Home/Error/{0}」);'在beta8中工作。 – 2015-11-19 07:48:11

+0

只需要提一下,截至目前1.1.0版本,似乎沒有'UseErrorPage()'擴展方法 – superjos 2017-01-02 19:47:54

1

內部在啓動類的配置功能,來電:

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"); 
    } 
4

您可以處理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); 
    } 
} 
+0

感謝!但是在我的測試中,我並不需要在啓動時404(使用Core 1.0) – Sean 2016-07-21 16:17:22

0

如果你有一個標準的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。

3

如果有人希望創建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根據自己的喜好。

+0

在管道末尾捕獲「/ errors/{0}」(複數「錯誤」),並且在屬性' [Route(「/ Error/{statusCode}」)]'(單數「錯誤」)。它不會工作。 – 2017-04-27 11:22:19