介紹
相信很多人在用.net core webapi開發的時候都遇到過這個問題,就是如果接口參數是實體的,需要在參數前面加上[FromBody](請求的參數是json格式)。
ps:如果是使用swagger測試的話是不需要[FromBody]的
這部分在官方文檔的模型綁定上是有描述的
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/model-binding?view=aspnetcore-3.1
所以通常情況下我們需要加上ApiController這個特性,一般我們都是在控制上加上這個特性。之前我開發過程中有時候忘記加上這個特性,會導致在前端對接的時候莫名報錯,所以我想要一個一勞永逸的辦法。
我已知的是建一個BaseController然后繼承它,但是我覺得這樣太呆板。
后來因為看了別人用IApplicationModelConvention 動態添加[Route]特性,我按葫蘆畫瓢但是沒有成功,事實上在調試的過程中ApiController是有的,但是我沒用搞清楚具體是什么原因沒有生效。
后來我仔細看了下Apicontroller這個類的Summary。
谷歌翻譯一下。
看着還是有點晦澀的。
但是看一下最后一句話:
當在裝配上進行裝飾時,裝配中的所有控制器將 將=視為具有API行為的控制器。
When decorated on an assembly, all controllers in the assembly will be treated= as controllers with API behavior.
我覺得我要的全局所有控制器都有這個特性的關鍵就是這一句話了,看到assembly這個字我在想什么不是跟加載類庫有關,因為我用這個最多的地方就是加載程序集的時候用到。
然后我就依照我這個思路在谷歌上往這個方向去找果不其然被我找到了,這是一位外網的微軟MVP
https://www.strathweb.com/2019/01/enabling-apicontroller-globally-in-asp-net-core-2-2/
按照它所說我在Startup文件的命名空間上加上了[ApiController]
lol啟動,哦不項目啟動!!!
出問題了,看來是沒加Route特性,這個HomeController是我建項目之后自帶的。所以可能全局注冊ApiController還跟這個有關。
果然加上[Route("api/[controller]")]之后就沒有問題了。
可能有些朋友跟我一樣在使用swagger的時候喜歡如下圖這種輸入參數的方式
這種方式如果正常情況下加上ApiController就變成example模式,就是如下圖這樣
這個是時候有個小妙招能在你調試的時候不需要全局注冊ApiController,但是在又不影響發布。
在Startup上面這樣寫就好了。
好了,今天的分享就結束了。