asp.net core webapi全局给控制器加上ApiController特性

介绍

相信很多人在用.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上面这样写就好了。

好了,今天的分享就结束了。

 

posted @ 2020-08-02 16:01  飞天猪皮怪  阅读(3191)  评论(0编辑  收藏  举报