最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解ASP.NET Core 處理 404 Not Found

 更新時(shí)間:2022年02月22日 11:02:39   作者:Sweet-Tang  
這篇文章主要介紹了詳解ASP.NET Core 處理 404 Not Found,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

問(wèn)題

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

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

解決方案

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

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

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

在處理 not-found 錯(cuò)誤時(shí),我們需要處理兩種不同的情況。

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

自定義視圖

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

這簡(jiǎn)化了我們的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);
  }

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

通配路由

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

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

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

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

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

StatusCodePagesWithReExecute方法 中件間

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

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

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

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

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

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

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

在這個(gè)例子中,我們有一個(gè)單獨(dú)的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é)所示的請(qǐng)求限制,那么您可以返回一個(gè)解釋為什么請(qǐng)求失敗的429頁(yè)面。

總結(jié)

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

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

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

翻譯:Sweet Tang

相關(guān)文章

  • WPF的數(shù)據(jù)綁定詳細(xì)介紹

    WPF的數(shù)據(jù)綁定詳細(xì)介紹

    數(shù)據(jù)綁定:是應(yīng)用程序 UI 與業(yè)務(wù)邏輯之間建立連接的過(guò)程。 如果綁定正確設(shè)置并且數(shù)據(jù)提供正確通知,則當(dāng)數(shù)據(jù)的值發(fā)生更改時(shí),綁定到數(shù)據(jù)的視覺(jué)元素會(huì)自動(dòng)反映更改。 數(shù)據(jù)綁定可能還意味著如果視覺(jué)元素中數(shù)據(jù)的外部表現(xiàn)形式發(fā)生更改,則基礎(chǔ)數(shù)據(jù)可以自動(dòng)更新以反映更改。
    2013-03-03
  • ASP.NET在IIS上注冊(cè)報(bào)0x800702e4錯(cuò)誤解決方法

    ASP.NET在IIS上注冊(cè)報(bào)0x800702e4錯(cuò)誤解決方法

    報(bào)一個(gè)0x800702e4 請(qǐng)求的操作需要提升的錯(cuò)誤。解決的方法和前面大同小異,給這個(gè)aspnet_regiis.exe創(chuàng)建一個(gè)快捷方式,給它的目標(biāo)后面加上 一個(gè)-i,再右擊這個(gè)快捷方式,以管理員身份運(yùn)行,就行了
    2012-08-08
  • .NET使用Moq進(jìn)行單元測(cè)試

    .NET使用Moq進(jìn)行單元測(cè)試

    這篇文章介紹了.NET使用Moq進(jìn)行單元測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • C#中Dictionary幾種遍歷的實(shí)現(xiàn)代碼

    C#中Dictionary幾種遍歷的實(shí)現(xiàn)代碼

    C#中Dictionary幾種遍歷的實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-02-02
  • .Net Core和jexus配置HTTPS服務(wù)方法

    .Net Core和jexus配置HTTPS服務(wù)方法

    下面小編就為大家分享一篇.Net Core和jexus配置HTTPS服務(wù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 注冊(cè)頁(yè)實(shí)現(xiàn)激活郵箱驗(yàn)證(asp.net c#)

    注冊(cè)頁(yè)實(shí)現(xiàn)激活郵箱驗(yàn)證(asp.net c#)

    在填寫(xiě)注冊(cè)提交后,大一點(diǎn)的網(wǎng)站會(huì)有郵箱激活驗(yàn)證這一步,本文也是實(shí)現(xiàn)了一下,感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-04-04
  • .NET Core配置多環(huán)境的方法步驟

    .NET Core配置多環(huán)境的方法步驟

    配置多環(huán)境是日常開(kāi)發(fā)經(jīng)常需要用到的操作,實(shí)現(xiàn)多環(huán)境配置后可以規(guī)避生產(chǎn)測(cè)試環(huán)境混合帶來(lái)的麻煩和風(fēng)險(xiǎn),這篇文章主要介紹了.NET Core配置多環(huán)境的方法步驟,感興趣的小伙伴們可以參考一下
    2019-03-03
  • ASP.NET從客戶端中檢測(cè)到有潛在危險(xiǎn)的request.form值的3種解決方法

    ASP.NET從客戶端中檢測(cè)到有潛在危險(xiǎn)的request.form值的3種解決方法

    這篇文章主要介紹了ASP.NET從客戶端中檢測(cè)到有潛在危險(xiǎn)的request.form值的3種解決方法,這是ASP.NET開(kāi)發(fā)中一個(gè)比較常見(jiàn)的經(jīng)典的問(wèn)題,需要的朋友可以參考下
    2015-01-01
  • 告別ADO.NET實(shí)現(xiàn)應(yīng)用系統(tǒng)無(wú)縫切換的煩惱(總結(jié)篇)

    告別ADO.NET實(shí)現(xiàn)應(yīng)用系統(tǒng)無(wú)縫切換的煩惱(總結(jié)篇)

    說(shuō)起ADO.NET,就扯上了數(shù)據(jù)庫(kù)訪問(wèn)類庫(kù)了,現(xiàn)在的每個(gè)項(xiàng)目的數(shù)據(jù)庫(kù)訪問(wèn)類應(yīng)該說(shuō)都很強(qiáng)的了,經(jīng)常就聽(tīng)到說(shuō)我的我們的數(shù)據(jù)庫(kù)訪問(wèn)類怎么怎么強(qiáng)大而且支持多數(shù)據(jù)庫(kù),現(xiàn)在的大家做的項(xiàng)目里用的數(shù)據(jù)庫(kù)訪問(wèn)類庫(kù)我想也都是支持多數(shù)據(jù)庫(kù)吧,支持到什么程度我就不知道了
    2009-11-11
  • VS初始化命令 ASP.NET常用技巧

    VS初始化命令 ASP.NET常用技巧

    此命令會(huì)運(yùn)行幾分鐘時(shí)間,與此同時(shí),Visual Studio 清除設(shè)置并將其自身重置到其最初的狀態(tài)。
    2011-03-03

最新評(píng)論

桓仁| 新沂市| 博爱县| 武安市| 广安市| 文昌市| 平泉县| 临高县| 平陆县| 晋州市| 惠来县| 蓝山县| 读书| 汾西县| 乌审旗| 无棣县| 应城市| 拜城县| 富平县| 桃园市| 抚松县| 亳州市| 陵川县| 普兰店市| 东丰县| 阿克苏市| 湖口县| 嘉峪关市| 泰来县| 开阳县| 句容市| 三亚市| 新乡市| 云安县| 阿拉善右旗| 秦皇岛市| 松江区| 佛山市| 荥阳市| 德昌县| 馆陶县|