1.若是Content-Type是application/json,而POST和PUT的参数是[FromBody] string value,那么若是curl -d的值是'{"Name": "uuu"}'这种JSON字符串将会报错(暂不知为什么),可是若是-d的值是'aas'这种普通字符串则不会有问题;json
可是若是将上面的string value改为AClass value,而后AClass里有个Name的属性那么-d '{"Name": "uuu"}'也是不会有问题的(这是由于字符串'sss'自己就是对于string类型对象,就像33对于类型是int同样[FromBody] int value);缓存
2.默认状况下WebApi对json请求体的属性名大小写不敏感,上诉的Name写成name也同样,哪怕AClass的属性是叫Name而非name;app
3.WebApi里的IActionFilter的实现类就相似SpringMVC里的只有before和after的Aspect,它可以对参数进行一个修改,可以记录日志,可是不能像Interceptor同样进行一个逻辑判断发现不合要求就中止请求;curl
在IActionFilter里已经将Request.Body转换为了[FromBody]的参数的值,而因为Request.Body也是和Java同样只能被读取一次的,所以在IActionFilter里开启filterContext.HttpContext.Request.EnableBuffering();是无效的,流已经被读取完了;async
IActionFilter对象的添加方式是经过ide
services.AddMvc(opt => { // 添加过滤器 opt.Filters.Add(typeof(ValidatorActionFilter)); })
4.能够不实现IActionFilter而是直接继承ActionFilterAttribute(ActionFilterAttribute同时兼具IActionFilter和IResultFilter,可是IExceptionFilter貌似没有对应的Attribute),这个类相似一个适配器,并且同时具备特性这个功能;url
5.对于.net core2.2以上的WebApi的拦截器若是要实现不符合要求就pass掉能够用以下方法.net
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来读取。中间件