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

正文

ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute

0. ApiControllerAttribute 继承自 ControllerAttribute

ASP.NET Core MVC 已经有了ControllerAttribute,这个用来标注一个类型是否是Controller。标注了之后框架就知道哪些是系统里面的Controller了。(框架也有其他方法来获取程序里面的Controller,所以,这个ControllerAttribute不是必须的)。

ApiControllerAttributeControllerAttribute的子类,所以,框架在处理Controller发现的时候和ControllerAttribute标注的对象是一样的。

但是,因为ApiControllerAttribute 实现了IApiBehaviorMetadata接口,所以提供了一些额外的特这些特性是以HTTP Api为出发点的。下面介绍一下这些特性。

1. 自动模型状态验证

这个是重点,框架会帮你自动验证model的state,也就是ModelState.(注:不过我就是因为用FluentValidation的时候模型验证不管用了出问题了才找到这篇文章的).

框架会为你自动注册ModelStateInvalidFilter,这个会运行在OnActionExecuting事件里面(具体来说:在action执行之前,model绑定之后)。他内部会检查ModelState是否为Valid,如果为InValid会直接返回400 BadRequest,这样就没有必要执行后面的代码,提高效率。

它会自动把model state 放到response里面,content type 是application/problem+json。当然你也可以自定义,因为毕竟你会有自己的验证,后文会讲。

下面,我们先来举个例子说一下。

  • 之前的写法

640?wx_fmt=png

  • 现在可以这么写

640?wx_fmt=png

顺道说一下,ModelStateInvalidFilter是个公共类,所以,不用ApiControllerAttribute也可以使用它。

2.参数绑定策略的自动推断

另一个非常有用的特性是action里面的参数的模型绑定可以自动推断。

ASP.NET Core MVC里面有一个比较令人恼怒的问题你需要手动给参数指定[FromBody]这个特性,以便让系统知道如何从Request body里面反序列化他们,比如反序列化json。因此,写了很多第三方的库来解决这个问题,比如:

  • WebApiContrib.Core.Formatter.Bson

  • WebApiContrib.Core.Formatter.Csv

  • 其他不写了,,就举个例子

现在,这些可以自动解决了。

除此之外,如果一个参数在route里面定义了,他会自动从先从path,也就是url上尝试绑定,不行的话会去从查询参数上绑定。IFormFlie默认从form表单上绑定获取。

下面看代码:

  • 之前

640?wx_fmt=png

3. 处理multipart/form-data请求

如果你的action里面的一个参数指定了[FromFile]特性(这通常是用于文件上传的),框架会自动假设请求是multipart/form-data。这个是用来解决社区里面提的这个问题。

不过这个也是可选的,只要你自己定义在action上定义一下[Consumes(...)]

4.其他

有两个注意点:

  1. ApiExplorer 的可见性。 默认所有的controller对ApiExplorer都是可见的,所以,不影响swagger 等的生成。

  2. 只是一个基于特性的路由。集中的路由机制不会应用在API controller,框架要求只能使用基于特性的路由,即在action上指定[Route("XXX")]的方式。

5. 行为自定义

像MVC框架的大部分组件一样,ApiControllerAttribute的行为是高度可自定义的。首先,上面说的大部分内容都是可以简单的用 on/off 来切换。

具体的设置是在startup方法里面通过ApiBehaviorOptions来实现,先来看一下这个类。

640?wx_fmt=png

所有bool类型的属性默认都是false。Suppres有阻止的意思。可以通过以下方法进行设置。

640?wx_fmt=png

来看一下InvalidModelStateResponseFactory属性,他是一个返回IActionResult的Func,通过他,我们可以注入自己的委托来实现需要的返回类型,举个例子。

640?wx_fmt=png

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


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新的UWP和Win32应用程序分发模型

自2005年引入ClickOnce技术以来,.NET就支持应用程序自动升级。在ClickOnce模型中,WinForms和WPF应用程序在启动时会从预先配置好的位置查找新版本。但是,由于微软试图模仿iOS应用商店模型,所以,该模型未能延续到UWP。微…

.net core grpc 实现通信(一)

现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端、服务端通信。grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC(Remote Procedure Call)框架,使用HTTP/2协议,…

子序列

牛客网题目 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数。 对于每组数据,第一行两个整数N,k,含义…

横向扩展你的ASP.NET Core SignalR 应用

前言最近项目要用signalr来做实时通信,在研究asp.netcore signalr 应用横向扩展时候发现了这篇国外的博客,和大家分享一下原文连接地址负载均衡当你把你的应用部署到生产环境时,你将会想横向扩展你的应用。横向扩展意味着要你的应用要在多台服…

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…

牛客网【每日一题】4月16日题目精讲 逆序对

文章目录题目描述题解:代码传送时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 131072K,其他语言262144K 64bit IO Format:%lld 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j位分别…

[BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 …

ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了:ASP.NET Core 2.1 做APIIdentity Server 4Angular 6Angular Material这个项目比较简单, 适合ASP.NET Core Web API 和 Angular 初学者. 项目最终完成的大致效果如图:声明: 以前虽然经…

[USACO]Sprinklers 2: Return of the Alfalfa P(网格DP)

思路: 由题目易得:网格内种植的两种植物形成了一条 左上—右下 的分界线,考虑将问题转化成 DP求出有多少条合法的分界线 我们注意到: 分界线上的点都必须放洒水器,且所放洒水器有唯一选择; 其他的可以放洒…

.net core grpc consul 实现服务注册 服务发现 负载均衡(二)

在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net core grpc 通信 的基础上加上 服务注册&#x…

【BZOJ3218】a+b problem (最小割 + 主席树)

传送门 继续优化&#xff1a;把a[ ]离散化 #include<bits/stdc.h> using namespace std; const int inf1000000007; const int N200010; const int M1000010;struct Edge{int u,v,f,next; }edge[M]; int head[N],cnt; int s,t,flow,level[N];struct Node{int x,id; }e[…

微软技术直通车(第三期)现场实录

微软技术直通车&#xff08;第三期&#xff09;于本月18日14时&#xff0c;在中国微软总部圆满举行。本次活动得到了微软最佳有价值专家&#xff08;Microsoft MVP&#xff09;中国区项目组的鼎力支持。同时&#xff0c;Microsoft MVP中国区项目组负责人也亲临现场致辞&#xf…

[NOI2019] 序列(模拟费用流)

原先自己想的建图&#xff1a; 正确建图&#xff1a; 但是 n 太大了&#xff0c;所以考虑模拟费用流&#xff1a; 注意&#xff1a; 在1中&#xff0c; 若选的两个位置相同&#xff0c;则为情况2&#xff0c;不用减 f&#xff1b; 若选的位置在另一序列中已被选&#xff0c;…

【结论】游戏(jzoj 5536)

游戏 jzoj 5536 题目大意&#xff1a; 给一个范围和一个矩形&#xff0c;让你在这个范围内放若干个这样的矩形&#xff08;不能改变方向&#xff0c;不能重叠&#xff09;&#xff0c;让你求出最少放多个矩形可以使范围内无法再放矩形 输入样例#1 11 4 3 2输入样例#2 10 …

LCA总结

文章目录LCA介绍解决方法概括&#xff1a;倍增法&#xff1a;Tarjan欧拉序树剖解法&#xff1a;看了很多关于LCA的文章&#xff0c;这里是一个总结我们通过这个题洛谷P3379 【模板】最近公共祖先来讲LCA LCA介绍 lca是啥&#xff1f;最近公共祖先 就是&#xff1a;两个点在这…

ASP.NET Core Web API + Ng6 实战视频 Day 2

第一天课程&#xff1a;ASP.NET Core Web API Identity Server 4 Angular 6 实战小项目视频Day 2 第一部分:Day 2 第二部分:视频专辑持续更新中....地址请点击原文链接.原文地址: http://v.qq.com/vplus/4cfb00af75c16eb8d198c58fb86eb4dc/foldervideos/8hk0029019k2fft.NET…

浮沉子

浮沉子制作及其原理 浮沉子的下沉过程&#xff1a;

.NET Core 项目指定SDK版本

一. 版本里的坑自从 .NET Core 2.1.0版本发布以后&#xff0c;近几个月微软又进行了几次小版本的发布&#xff0c;可见 .NET Core 是一门生命力非常活跃的技术。经过一段时间的实践&#xff0c;目前做 ASP.NET Core 开发时&#xff0c;使用的 Nuget 包&#xff0c;比如 Microso…

牛客网【每日一题】4月17日题目精讲 华华给月月准备礼物

文章目录题目描述题解&#xff1a;代码&#xff1a;推荐例题&#xff1a;试题链接时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 二月中旬虐狗节前夕&#xff0c;华华决定给…

Bing.com在.NET Core 2.1上运行

相关知识请参考.netCore开发团队博客 https://blogs.msdn.microsoft.com/dotnet/ Bing.com是一种云服务&#xff0c;运行在遍布全球许多数据中心的数千台服务器上。Bing服务器每秒处理来自全球消费者的数千个用户查询&#xff0c;通过他们的浏览器&#xff0c;使用Microsoft认…