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上面这样写就好了。
好了,今天的分享就结束了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧