WebApi零碎总结

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来读取。中间件

相关文章
相关标签/搜索