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

  • 时间:
  • 浏览: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 = 2000;
                LogUtil.Error($"response exception:{ex.Message}");// {ex.StackTrace}
                await ResponseUtil.HandleExceptionAsync(2000, "服务器错误");
            }
        }
    }

你这个地方的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 = 200;
                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%的性能时延而去冒200%甚至更高的风险,为什要我 还是要说一句,net core到目前为止机会历过另一另两个 大版本的更新,觉得3.0那末 正式发布,为什让另一另两个 个版本的更新事先,稳定性机会很ok了,太满该吃螃蟹都还可以 动手了

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


补充 2019-07-31

今天在做调试的事先发现另一另两个 疑问,现状如下



发现你这个疑问我的第一反应是,字符编码,为什让看一遍我回调的事先明显机会设置了ContentType,太满你这个应该都不 错误的由于,为什让多次刷新的测试结果是偶尔正常,怪异的情形老会 伴随着bug,于是比对了正确的回调信息和错误的回调信息(这里是通过chrome浏览器调试为什让获取的回调信息,具体调试妙招后续前端介绍,当然基本上都知道)。



原来一看发现了疑问所在,太满你这个地方决定不再自主去设置Length了。