国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

詳解ASP.NET Core 處理 404 Not Found

2019-12-12 01:53:39
字體:
供稿:網(wǎng)友

問題

在沒有修改任何配置的情況下,這是用戶使用 Chrome 訪問不存在的URL時會看到的內(nèi)容:

幸運的是,處理錯誤狀態(tài)代碼非常簡單,我們將在下面介紹三種技術(shù)。

解決方案

在以前的ASP.NET MVC版本中,主要在 web.config 中處理404錯誤的。

您可能記得在 <customErrors> 節(jié)點中配置ASP.NET管道處理404錯誤,以及在低版本的IIS中通過 <httpErrors> 節(jié)點處理 404錯誤。好像有點混亂。

在.Net Core中,情況就不同了,沒有必要使用XML配置(盡管如果您是通過IIS代理,您仍然可以在web.config中使用 httpErrors,并且您真的想這樣嗎:-))。

在處理 not-found 錯誤時,我們需要處理兩種不同的情況。

URL與任何路由不匹配的情況。在這種情況下,如果我們無法確定用戶正在訪問什么,我們需要返回一個通用的未找到的頁面。有兩種常見的處理方法,但首先我們將討論第二種情況。URL與路由匹配的情況,但是一個或多個參數(shù)無效,我們可以用自定義視圖來解決這個問題。

自定義視圖

這種情況的一個例子是具有無效或過期ID的產(chǎn)品頁面。在這里,我們知道用戶正在查看產(chǎn)品,而不是返回通用錯誤,我們可以更友好的頁面,返回自定義未找到產(chǎn)品的的頁面。這仍然需要返回404狀態(tài)代碼,但是使用不通用的頁面,同時也可以向用戶顯示類似或受歡迎的產(chǎn)品。

處理這些情況是非常瑣碎,我們需要做的是在返回我們的自定義視圖之前設(shè)置狀態(tài)代碼:

  public async Task<IActionResult> GetProduct(int id)  {    var viewModel = await _db.Get<Product,GetProductViewModel>(id);      if (viewModel == null)    {      Response.StatusCode = 404;      return View("ProductNotFound");    }      return View(viewModel);  }

當(dāng)然,您可能更喜歡將其包裝成自定義ActionResult:

  public class NotFoundViewResult : ViewResult  {    public NotFoundViewResult(string viewName)          {      ViewName = viewName;      StatusCode = (int)HttpStatusCode.NotFound;    }  }

這簡化了我們的Action:

  public async Task<IActionResult> GetProduct(int id)  {    var viewModel = await _db.Get<Product,GetProductViewModel>(id);      if (viewModel == null)    {      return new NotFoundViewResult("ProductNotFound");    }      return View(viewModel);  }

這個簡單的技術(shù)涵蓋了特定的404頁,現(xiàn)在來看看通用的404錯誤,我們無法弄清楚用戶想要查看的內(nèi)容。

通配路由

在先前版本的MVC,創(chuàng)建一個通配符路由來處理,在.NET Core中,也可以使用相同的方式。這個方式是,您有一個通配符路由,它會接收任何其它路由尚未處理的URL。使用特性路由,方式如下:

  [Route("{*url}", Order = 999)]  public IActionResult CatchAll()  {    Response.StatusCode = 404;    return View();  }

重要的是指定順序,以確保其它路由優(yōu)先。

一個通配符路由的方式非常不錯,但它不是.NET Core中的首選。雖然全部路由將處理404,但下一個方式將處理任何非成功狀態(tài)代碼,以便您可以執(zhí)行以下Action(可能在生產(chǎn)中的Action過濾器中):
 

  public async Task<IActionResult> GetProduct(int id)  {    ...      if (RequiresThrottling())    {      return new StatusCodeResult(429)    }      if (!HasPermission(id))    {      return Forbid();    }      ...  }

StatusCodePagesWithReExecute方法 中件間

UseStatusCodePagesWithReExecute使用了一個非常聰明的中間件(StatusCodePagesMiddleware),在未輸出響應(yīng)前,它能處理非成功狀態(tài)代碼。這意味著如果您使用上面詳細(xì)描述的自定義視圖技術(shù),則404狀態(tài)代碼將不會被中間件處理(這正是我們想要的)。

當(dāng)從內(nèi)部中間件組件返回錯誤代碼(如404)時,UseStatusCodePagesWithReExecute允許您執(zhí)行另一個控制器Action來處理狀態(tài)代碼。

您可以在startup.cs中使用一行代碼將其添加到管道中:

  app.UseStatusCodePagesWithReExecute("/error/{0}");  ...  app.UseMvc();

中間件定義的順序很重要,您需要確保在可能返回錯誤代碼的任何中間件(如MVC中間件)之前注冊StatusCodeWithReExecute

您可以指定一個固定路徑來執(zhí)行或使用狀態(tài)代碼值的占位符,如上所述。

您還可以指向靜態(tài)頁面(假設(shè)您已經(jīng)具有StaticFileMiddleware中間件)和控制器Action。

在這個例子中,我們有一個單獨的Action處理404。任何其它非成功狀態(tài)代碼,使用 Error Action。

  [Route("error/404")]  public IActionResult Error404()  {    return View();  }    [Route("error/{code:int}")]  public IActionResult Error(int code)  {    // handle different codes or just return the default error view    return View();  }

顯然,您可以根據(jù)您的需要量身定制。例如,如果您正在使用上一節(jié)所示的請求限制,那么您可以返回一個解釋為什么請求失敗的429頁面。

總結(jié)

處理404頁面的具體問題最好用自定義視圖來處理,并設(shè)置狀態(tài)代碼(直接或通過自定義操作結(jié)果)。

通過使用StatusCodePagesMiddleware中間件,可以非常容易地處理通用404錯誤(或?qū)嶋H上是任何非成功狀態(tài)代碼)。一般來說,這兩種技術(shù)是在ASP.NET Core中處理非成功HTTP狀態(tài)代碼的首選方法。

原文:《Handling 404 Not Found in Asp.Net Core

翻譯:Sweet Tang

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 锡林浩特市| 威宁| 白山市| 宁远县| 西丰县| 黑河市| 青田县| 海伦市| 安塞县| 大丰市| 南昌市| 盐亭县| 宁南县| 顺昌县| 泰兴市| 昭苏县| 自贡市| 会同县| 宁夏| 文登市| 丰县| 巨鹿县| 中方县| 台江县| 中宁县| 庄河市| 当阳市| 甘谷县| 玛沁县| 阳原县| 阜阳市| 盐边县| 鹤壁市| 吉水县| 太湖县| 拉孜县| 嘉兴市| 商河县| 闽侯县| 都匀市| 耒阳市|