• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.netcorewebapi全局给控制器加上ApiController特性

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

介绍

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

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
.NET3.5和VS2008中的ASP.NETAJAX发布时间:2022-07-10
下一篇:
Asp.netcore学习笔记RazorPage发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap