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

  • 时间:
  • 浏览:9
  • 来源:大发快三_快三代理_大发快三代理

前言

一天天谁能谁能告诉我为什么会么会在么在过的,但随便说说挺忙,事赶事不带停那种,我都可不可以 感觉跟在流水线干活一样,忙活的事差不要 了就喘口气继续补充這個系列的内容,前面几篇基本上把没办法 常规的后端服务搭建差不要 了,上面的会老是根据当时人都可不可以 因此常规的测试内容来有些点完善更新。

拦截器

这里先不提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层创建的(公共类尽量扔到同没办法 工程类库下,事先一键打包,各种复用)。

    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>();
            …
        }

没办法 我们歌词 歌词 在全局因此出現异常的事先,都可不可以 统一捕获到哪些地方的什么的问题,因此做记录,当然在测试环境下注意,因此這個错误帮助页打开的事先,那上面的拦截器将毫无乱用。

测试结果



没办法 因此随便说说 哪个地方没办法 做异常捕获,全局最终都不 没办法 挺纪的抓住因此告诉你,好处是因此懒那就所有地方都不 写了,哪些地方的什么的问题是有些异常即使捕获因此必须告知用户因此都可不可以 做记录(比如文件上传下载的线程中断异常相似的),有些這個因此为了保险起见而都不 为了省事。

身份验证拦截器

接下来我们歌词 歌词 继续创建没办法 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到目前为止因此历过没办法 大版本的更新,随便说说3.0没办法 正式发布,因此没办法 个版本的更新事先,稳定性因此很ok了,有些该吃螃蟹都都可不可以 动手了

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


补充 2019-07-31

今天在做调试的事先发现没办法 哪些地方的什么的问题,现状如下



发现這個哪些地方的什么的问题我的第一反应是,字符编码,因此看到我回调的事先明显因此设置了ContentType,有些這個应该都不 错误的意味,因此多次刷新的测试结果是偶尔正常,怪异的具体情况老是伴随着bug,于是比对了正确的回调信息和错误的回调信息(这里是通过chrome浏览器调试因此获取的回调信息,具体调试法律土办法后续前端介绍,当然基本上都知道)。



没办法 一看发现了哪些地方的什么的问题所在,有些這個地方决定不再自主去设置Length了。