WebApi零碎总结
1.如果Content-Type是application/json,而POST和PUT的参数是[FromBody] string value,那么如果curl -d的值是'{"Name": "uuu"}'这种JSON字符串将会报错(暂不知为何),但是如果-d的值是'aas'这种普通字符串则不会有问题;
但是如果将上面的string value改成AClass value,然后AClass里有个Name的属性那么-d '{"Name": "uuu"}'也是不会有问题的(这是因为字符串'sss'本身就是对于string类型对象,就像33对于类型是int一样[FromBody] int value);
2.默认情况下WebApi对json请求体的属性名大小写不敏感,上诉的Name写成name也一样,哪怕AClass的属性是叫Name而非name;
3.WebApi里的IActionFilter的实现类就类似SpringMVC里的只有before和after的Aspect,它能够对参数进行一个修改,能够记录日志,但是不能像Interceptor一样进行一个逻辑判断发现不合要求就停止请求;
在IActionFilter里已经将Request.Body转换为了[FromBody]的参数的值,而由于Request.Body也是和Java一样只能被读取一次的,因此在IActionFilter里开启filterContext.HttpContext.Request.EnableBuffering();是无效的,流已经被读取完了;
IActionFilter对象的添加方式是通过
services.AddMvc(opt =>
{
// 添加过滤器
opt.Filters.Add(typeof(ValidatorActionFilter));
})
4.可以不实现IActionFilter而是直接继承ActionFilterAttribute(ActionFilterAttribute同时兼具IActionFilter和IResultFilter,但是IExceptionFilter貌似没有对应的Attribute),这个类类似一个适配器,而且同时具有特性这个功能;
5.对于.net core2.2以上的WebApi的拦截器如果要实现不符合要求就pass掉可以用如下方法
public class AuthFilter : ActionFilterAttribute
{
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (!(context.ActionDescriptor is ControllerActionDescriptor))
{
throw new ArgumentException();
}
Console.WriteLine("开始啦啦啦啦啦" + "###" + ((ControllerActionDescriptor) context.ActionDescriptor).MethodInfo.CustomAttributes.Aggregate("", (a, b) => string.Join(",", a, b.AttributeType)));
if (context.ActionDescriptor.DisplayName.Contains("Get"))
{
context.HttpContext.Response.Headers.Add("Content-Type", "application/json;charset=utf8");
await context.HttpContext.Response.WriteAsync("鉴权失败", Encoding.UTF8);
}
else
{
// 只有Async的才能实现Around的功能
var resultContext = await next();
}
Console.WriteLine("结束啦啦啦啦啦");
}
}
6.可以在Startup里通过app来Use一个中间件,这个中间件就类似Tomcat的Filter:
app.UseHttpsRedirection();
app.Use(BarMiddleware);
app.UseMvc(); } private static RequestDelegate BarMiddleware(RequestDelegate next) =>
async context =>
{
Console.WriteLine("比IActionFilter最先的要先");
context.Request.EnableBuffering();
await next(context);
Console.WriteLine("比IActionFilter最后的要后");
};
7..net core2.2里的WebApi的HttpContext.Request.Body的流本身就是可重复读取的,不需要再用HttpContext.Request.EnableBuffering();开启请求体缓存,不过主动读取Body之前要:HttpContext.Request.Body.Position = 0;然后用StreamReader来读取。
WebApi零碎总结的更多相关文章
- webapi - 使用依赖注入
本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...
- Taurus.MVC 2.0 开源发布:WebAPI开发教程
背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(66)-MVC WebApi 用户验证 (2)
系列目录 前言: 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)
系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入
系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...
随机推荐
- install linux on VM
1. install完成之后,没有UI,可以在安装的向导过程中配置,先点击language,选择英语,然后再software那里 勾选,server with gui->KDE, 一定要在看到的 ...
- selenium IDE安装与使用
官网介绍: Selenium IDE是一个Firefox插件,它记录并回放用户与浏览器的交互.使用它来创建简单的脚本或者帮助进行探索性测试. 安装流程: 只支持用火狐浏览器安装,可以用火狐浏览器的应用 ...
- form表单的三个属性 action 、mothod 、 enctype。
form_action: 表单数据提交到此页面 下面的表单拥有两个输入字段以及一个提交按钮,当提交表单时,表单数据会提交到名为 "form_action.asp" 的页面: < ...
- Java简单操作Zookeeper
Zookeeper客户端链接 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId ...
- 需要重写URL但请求的目录不存在报404
用的是asp.net webform,在global.asax的application_beginrequest中写的代码 很简单的一个需求,在url中输入http://www.test.com/lc ...
- 自己实现HashSet
HashSet的实现相对比较简单.它强依赖于HashMap,包括底层数据实际上就是存储于HashMap,由于HashMap在哈希碰撞下,如果value值相同,那么将会覆盖该value,HashSet正 ...
- python异常捕捉以及处理
看标题觉得高大上,好像能处理所有的异常.但是,事实是只能按照字面的意思来理解这一段话. 众所周知写代码哪有不出bug的? 那么出现了bug 我们不想让程序因为bug的存在而退出.那么要怎么做呢? 今天 ...
- CV迅速发展
- 关于web前端中遇到的html,css小知识点
容器溢出: 语法:overflow: visible | hidden | scroll | auto | inherit; visible:默认值,溢出内容不会被裁剪,正常显示 hidden: 溢出 ...
- py_innodb_page_info
python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1 mylib.py #encoding=utf-8 import os imp ...