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

  • 时间:
  • 浏览:0
  • 来源:极速快3_快3链接_极速快3链接

前言

一天天告诉我为什么在么在过的,但并非 挺忙,事赶事不带停那种,我须要 感觉跟在流水线干活一样,忙活的事差太满了就喘口气继续补充你这一系列的内容,前面几篇基本上把一另一两个 常规的后端服务搭建差太满了,上端的会老要 根据买车人须要肯能常规的测试内容来其他点完善更新。

拦截器

这里先不提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 = 30000;
                LogUtil.Error($"response exception:{ex.Message}");// {ex.StackTrace}
                await ResponseUtil.HandleExceptionAsync(30000, "服务器错误");
            }
        }
    }

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

    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 = 3000;
                response.ContentLength = text.Length;
                return response.WriteAsync(text);
            }
            else
            {
                return response.WriteAsync(text);
            }
        }
    }

完后 大家依然要在Startup中注册大家你这一上端层。

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

完后 大家在全局肯能老要 冒出异常的完后 ,可太满再要再 统一捕获到问提图片,已经 我 做记录,当然在测试环境下注意,肯能你这一错误帮助页打开的完后 ,那上端的拦截器将毫无乱用。

测试结果



完后 肯能岂须要哪个地方不能自己做异常捕获,全局最终须要一另一两个 严紧的抓住已经 我 告诉你,好处是肯能懒那就所有地方须要写了,问提图片是其他异常即使捕获已经 我 不须要告知用户其他须要做记录(比如文件上传下载的进程中断异常例如的),其他你这一其他为了保险起见而须要为了省事。

身份验证拦截器

接下来大家继续创建一另一两个 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%的性能传输下行速率 而去冒300%甚至更高的风险,已经 我 我还是要说一句,net core到目前为止肯能历过一另一两个 大版本的更新,并非 3.0不能自己正式发布,已经 我 一另一两个 个版本的更新完后 ,稳定性肯能很ok了,其他该吃螃蟹都可太满再要再 动手了

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


补充 2019-07-31

今天在做调试的完后 发现一另一两个 问提图片,现状如下



发现你这一问提图片我的第一反应是,字符编码,已经 我 看一遍我回调的完后 明显肯能设置了ContentType,其他你这一应该须要错误的原因,已经 我 多次刷新的测试结果是偶尔正常,怪异的情形老要 伴随着bug,于是比对了正确的回调信息和错误的回调信息(这里是通过chrome浏览器调试已经 我 获取的回调信息,具体调试最好的土办法后续前端介绍,当然基本上都知道)。



完后 一看发现了问提图片所在,其他你这一地方决定不再自主去设置Length了。