net core Webapi基础工程搭建(七)——小试AOP及常规测试

  • 时间:
  • 浏览:0
  • 来源:大发uu快3_uu快3信誉网_大发uu快3信誉网

前言

一天天问你为什么会么会过的,但我我真是挺忙,事赶事不带停那种,帮我感觉跟在流水线干活一样,忙活的事差太多了就喘口气继续补充一些 系列的内容,前面几篇基本上把2个 常规的后端服务搭建差太多了,后面 的会无缘无故根据我各自 需要或者常规的测试内容来一些点完善更新。

拦截器

这里先不提AOP的内容,其我我真是我我各自 完后 的理解,AOP开发的思想但是,亲戚亲戚人们歌词 歌词 人们歌词 歌词 做的一些操作类事身份验证,日志记录,异系紧捕等等那些操作,都可否单独拎出来放那,谁用了加个头部标识就都可否了,剩余的交给代码来防止,那我亲戚亲戚人们歌词 歌词 人们歌词 歌词 开发就只需要关心业务功能,而一些的太多都可否不让考虑,这但是框架的好处,别人封装集成好,就都可否省去很大的开发工作量。

好,结速说拦截器,我我真是也是后面 层,我各自 感觉跟AOP的概念类事,就里装这里写上了。

异常拦截器

在亲戚亲戚人们歌词 歌词 人们歌词 歌词 Api的工程目录下新建文件夹Filters用于存放拦截器,完后 亲戚亲戚人们歌词 歌词 人们歌词 歌词 新建ExceptionFilter一些 异常的拦截器,用于记录工程抛异常并做对应回调防止。

代码如下,具体不太多解释,或者我我真是我真是一些 没啥说的,但是注意异步调用的问提即可。

    public class ExceptionFilter
    {
        private readonly RequestDelegate _next;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="next"></param>
        public ExceptionFilter(RequestDelegate next)
        {
            _next = next;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex) //发生异常
            {
                context.Response.StatusCode = 4000;
                LogUtil.Error($"response exception:{ex.Message}");// {ex.StackTrace}
                await ResponseUtil.HandleExceptionAsync(4000, "服务器错误");
            }
        }
    }

一些 地方的ResponseUtil是单独在Util层创建的(公共类尽量扔到同2个 工程类库下,完后 一键打包,各种复用)。

    public class ResponseUtil
    {
        /// <summary>
        /// 回调
        /// </summary>
        /// <param name="statusCode">html请况码</param>
        /// <param name="msg">消息</param>
        /// <returns></returns>
        public static Task HandleExceptionAsync(int statusCode, string msg)
        {
            var data = new { code = statusCode, msg = msg };
            string text = JsonConvert.SerializeObject(data);
            var response = AprilConfig.HttpCurrent.Response;
            if (string.IsNullOrEmpty(response.ContentType))
            {
                //跨域的完后

注意,不带header都可否了接撤回调
                response.Headers.Add("Access-Control-Allow-Origin", "*");
                response.Headers.Add("Access-Control-Allow-Credentials", "true");
                //或者一些

是json
                response.ContentType = "application/json;charset=utf-8";
                response.StatusCode = 400;
                response.ContentLength = text.Length;
                return response.WriteAsync(text);
            }
            else
            {
                return response.WriteAsync(text);
            }
        }
    }

完后 亲戚亲戚人们歌词 歌词 人们歌词 歌词 依然要在Startup中注册亲戚亲戚人们歌词 歌词 人们歌词 歌词 一些 后面 层。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMiddleware<ExceptionFilter>();
            …
        }

那我亲戚亲戚人们歌词 歌词 人们歌词 歌词 在全局或者无缘无故出显异常的完后 ,都可否统一捕获到问提,或者做记录,当然在测试环境下注意,或者一些 错误帮助页打开的完后 ,那后面 的拦截器将毫无乱用。

测试结果



那我如甜得是哪个地方都可否了做异常捕获,全局最终总要2个 落细落的抓住或者告诉你,好处是或者懒那就所有地方都在写了,问提是一些异常即使捕获或者需要告知用户但是需要做记录(比如文件上传下载的多程序运行 中断异常类事的),太多一些 但是为了保险起见而都在为了省事。

身份验证拦截器

接下来亲戚亲戚人们歌词 歌词 人们歌词 歌词 继续创建2个 AuthFilter,目的是做身份验证的判断,或者没通过就没必要再进入具体的控制器了。

    public class AuthFilter
    {
        private readonly RequestDelegate _next;

        public AuthFilter(RequestDelegate next)
        {
            _next = next;
        }

        public Task Invoke(HttpContext context)
        {
            if (context.Request.Method == "OPTIONS")
            {
                return _next(context);
            }
            var headers = context.Request.Headers;
            //检查头文件与否有jwt token
            if (!headers.ContainsKey("Authorization"))
            {
                string path = context.Request.Path.Value;
                if (!AprilConfig.AllowUrl.Contains(path) && path.IndexOf("swagger") < 0)
                {
                    //这里做下相关的身份校验
                    return ResponseUtil.HandleExceptionAsync(401, "请登录");
                    
                    //判断与否有权限查看(在身份验证后判断对应的权限,一些

依据

后续再写)
                    return ResponseUtil.HandleExceptionAsync(-2, "无权访问");

                }
            }
            return _next(context);
        }
    }

同样亲戚亲戚人们歌词 歌词 人们歌词 歌词 需要在Startup注册使用后面 层。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMiddleware<ExceptionFilter>();
            app.UseMiddleware<AuthFilter>();
            …
        }

测试



或者访问亲戚亲戚人们歌词 歌词 人们歌词 歌词 的Swagger,效果就很明显了。

小结

一些 篇主要但是引入后面 层的使用,我各自 认为那些AOP开发OOP开发全部因人而异,没必要为了追求新技术而去整体大功能改造,新技术我我真是使用起来方便,都在很好的前景,或者对于企业来讲,稳定是最重要的,不让为了1%的性能速率而去冒400%甚至更高的风险,或者我还是要说一句,net core到目前为止或者历过2个 大版本的更新,我真是3.0都可否了正式发布,或者2个 个版本的更新完后 ,稳定性或者很ok了,太多该吃螃蟹都都可否动手了

下一篇,继续引入AOP的开发,主要用的第三方的组件AspectCore,将针对接口调用的完后 做一些常规操作。


补充 2019-07-31

今天在做调试的完后 发现2个 问提,现状如下



发现一些 问提我的第一反应是,字符编码,或者看一遍我回调的完后 明显或者设置了ContentType,太多一些 应该都在错误的原因分析分析,或者多次刷新的测试结果是偶尔正常,怪异的请况无缘无故伴随着bug,于是比对了正确的回调信息和错误的回调信息(这里是通过chrome浏览器调试或者获取的回调信息,具体调试依据 后续前端介绍,当然基本上都知道)。



那我一看发现了问提所在,太多一些 地方决定不再自主去设置Length了。