日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

發(fā)布時(shí)間:2023/12/4 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正文

ASP.NET Core MVC 2.1 特意為構(gòu)建 HTTP API 提供了一些小特性,今天主角就是?ApiControllerAttribute。

0. ApiControllerAttribute 繼承自 ControllerAttribute

ASP.NET Core MVC?已經(jīng)有了ControllerAttribute,這個(gè)用來標(biāo)注一個(gè)類型是否是Controller。標(biāo)注了之后框架就知道哪些是系統(tǒng)里面的Controller了。(框架也有其他方法來獲取程序里面的Controller,所以,這個(gè)ControllerAttribute不是必須的)。

ApiControllerAttribute是ControllerAttribute的子類,所以,框架在處理Controller發(fā)現(xiàn)的時(shí)候和ControllerAttribute標(biāo)注的對(duì)象是一樣的。

但是,因?yàn)锳piControllerAttribute?實(shí)現(xiàn)了IApiBehaviorMetadata接口,所以提供了一些額外的特這些特性是以HTTP Api為出發(fā)點(diǎn)的。下面介紹一下這些特性。

1. 自動(dòng)模型狀態(tài)驗(yàn)證

這個(gè)是重點(diǎn),框架會(huì)幫你自動(dòng)驗(yàn)證model的state,也就是ModelState.(注:不過我就是因?yàn)橛肍luentValidation的時(shí)候模型驗(yàn)證不管用了出問題了才找到這篇文章的).

框架會(huì)為你自動(dòng)注冊(cè)ModelStateInvalidFilter,這個(gè)會(huì)運(yùn)行在OnActionExecuting事件里面(具體來說:在action執(zhí)行之前,model綁定之后)。他內(nèi)部會(huì)檢查ModelState是否為Valid,如果為InValid會(huì)直接返回400 BadRequest,這樣就沒有必要執(zhí)行后面的代碼,提高效率。

它會(huì)自動(dòng)把model state 放到response里面,content type 是application/problem+json。當(dāng)然你也可以自定義,因?yàn)楫吘鼓銜?huì)有自己的驗(yàn)證,后文會(huì)講。

下面,我們先來舉個(gè)例子說一下。

  • 之前的寫法

  • 現(xiàn)在可以這么寫

順道說一下,ModelStateInvalidFilter是個(gè)公共類,所以,不用ApiControllerAttribute也可以使用它。

2.參數(shù)綁定策略的自動(dòng)推斷

另一個(gè)非常有用的特性是action里面的參數(shù)的模型綁定可以自動(dòng)推斷。

ASP.NET Core MVC里面有一個(gè)比較令人惱怒的問題你需要手動(dòng)給參數(shù)指定[FromBody]這個(gè)特性,以便讓系統(tǒng)知道如何從Request body里面反序列化他們,比如反序列化json。因此,寫了很多第三方的庫(kù)來解決這個(gè)問題,比如:

  • WebApiContrib.Core.Formatter.Bson

  • WebApiContrib.Core.Formatter.Csv

  • 其他不寫了,,就舉個(gè)例子

現(xiàn)在,這些可以自動(dòng)解決了。

除此之外,如果一個(gè)參數(shù)在route里面定義了,他會(huì)自動(dòng)從先從path,也就是url上嘗試綁定,不行的話會(huì)去從查詢參數(shù)上綁定。IFormFlie默認(rèn)從form表單上綁定獲取。

下面看代碼:

  • 之前

3. 處理multipart/form-data請(qǐng)求

如果你的action里面的一個(gè)參數(shù)指定了[FromFile]特性(這通常是用于文件上傳的),框架會(huì)自動(dòng)假設(shè)請(qǐng)求是multipart/form-data。這個(gè)是用來解決社區(qū)里面提的這個(gè)問題。

不過這個(gè)也是可選的,只要你自己定義在action上定義一下[Consumes(...)]。

4.其他

有兩個(gè)注意點(diǎn):

  • ApiExplorer 的可見性。 默認(rèn)所有的controller對(duì)ApiExplorer都是可見的,所以,不影響swagger 等的生成。

  • 只是一個(gè)基于特性的路由。集中的路由機(jī)制不會(huì)應(yīng)用在API controller,框架要求只能使用基于特性的路由,即在action上指定[Route("XXX")]的方式。

  • 5. 行為自定義

    像MVC框架的大部分組件一樣,ApiControllerAttribute的行為是高度可自定義的。首先,上面說的大部分內(nèi)容都是可以簡(jiǎn)單的用 on/off 來切換。

    具體的設(shè)置是在startup方法里面通過ApiBehaviorOptions來實(shí)現(xiàn),先來看一下這個(gè)類。

    所有bool類型的屬性默認(rèn)都是false。Suppres有阻止的意思。可以通過以下方法進(jìn)行設(shè)置。

    來看一下InvalidModelStateResponseFactory屬性,他是一個(gè)返回IActionResult的Func,通過他,我們可以注入自己的委托來實(shí)現(xiàn)需要的返回類型,舉個(gè)例子。

    原文地址:https://www.cnblogs.com/sheldon-lou/p/9495377.html


    .NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com?

    總結(jié)

    以上是生活随笔為你收集整理的讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。