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零碎总结的更多相关文章

  1. webapi - 使用依赖注入

    本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...

  2. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  3. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. Taurus.MVC 2.0 开源发布:WebAPI开发教程

    背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件

    系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(66)-MVC WebApi 用户验证 (2)

    系列目录 前言: 回顾上一节,我们利用webapi简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(65)-MVC WebApi 用户验证 (1)

    系列目录 前言: WebAPI主要开放数据给手机APP,其他需要得知数据的系统,或者软件应用,所以移动端与系统的数据源往往是相通的. Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能, ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入

    系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...

随机推荐

  1. Linux中 ./configure --prefix命令

    源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install),具体的安装方法一般作者都会给出文档,这里主要讨论配置(configure).Configu ...

  2. Quartz与Spring集成(二)

    一.获取quartz详情jar <!-- quartz 的jar --> <dependency> <groupId>org.quartz-scheduler< ...

  3. svn 恢复删除文件

    参考这个 https://blog.csdn.net/qdujunjie/article/details/37766167

  4. 线程和进程PYTHON

    基本概念: 计算机一次只能运行一个进程,而一个进程又可以有多个线程,例如百度网盘的上传和下载. 1.线程的创建 .调用threading模块 .创建线程theading.Threads(target ...

  5. python将文本写入剪切板

    import pyperclip pyperclip.copy('The text to be copied to the clipboard.') spam = pyperclip.paste() ...

  6. JVM深入理解

    JVM深入理解 一.JVM介绍 JVM应用百度百科的原话是: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过 ...

  7. functools 之 partial(偏函数)

    当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单.当然,decorator(装饰器) 也可以实现, ...

  8. 20175234 2018-2019-2 《Java程序设计》第九周学习总结

    目录 20175234 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 教材学习中的问题和解决过程 代码托管 感想 学习进度条 参考资料 20175234 2 ...

  9. maven学习--1.项目结构及简单使用

    1.项目目录结构 MavenProjectRoot(项目根目录)   |----src   |     |----main   |     |         |----java ——存放项目的.ja ...

  10. debian proftpd安装