接口调优——WebAPI 过滤器,IIS WebDAV
目录
- 1、身份认证过滤器—AuthenticationFilter
- 2、Action 过滤器—ActionFilter
- 3、异常处理过滤器—ExceptionFilterAttribute
- 4、IS WebDAV 模块
本周工作的时候,任务计划已经完成,进行了接口的调优,其中对于过滤器这一块着重进行了调整。
在这个过程中对过滤器的顺序有了一定了解,这里记录下来。
1、身份认证过滤器—AuthenticationFilter
这个是做统一身份认证授权的,这个是最先进来的,进行用户身份验证:
- public class BasicAuthenticationFilterAttribute : FilterAttribute, IAuthenticationFilter
- {
- public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
- {
- if (context.ActionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
- {
- return Task.FromResult();
- }
- // 具体认证业务逻辑
- }
- public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
- {
- string realm = context.Request.RequestUri.DnsSafeHost;
- context.Result = new AddBasicChallengeResult(context.Result, realm);
- return Task.FromResult();
- }
- // 错误信息生成
- public class AuthenticationFailureResult : IHttpActionResult
- {
- public AuthenticationFailureResult(HttpRequestMessage request)
- {
- Request = request;
- }
- public HttpRequestMessage Request { get; private set; }
- public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
- {
- return Task.FromResult(Execute());
- }
- private HttpResponseMessage Execute()
- {
- HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
- {
- RequestMessage = Request
- };
- return response;
- }
- }
- // 认证失败返回质询信息
- private class AddBasicChallengeResult : IHttpActionResult
- {
- private IHttpActionResult innerResult;
- private string realm;
- public AddBasicChallengeResult(IHttpActionResult innerResult, string realm)
- {
- this.innerResult = innerResult;
- this.realm = realm;
- }
- public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
- {
- var response = await innerResult.ExecuteAsync(cancellationToken);
- if (response.StatusCode == HttpStatusCode.Unauthorized)
- response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Basic", String.Format("realm=\"{0}\"", realm)));
- return response;
- }
- }
- }
2、Action 过滤器—ActionFilter
这个是对操作进行统一过滤的过滤器,在这个过滤器里面可以做的事情就很多,我们这里用到了:模型验证、请求信息记录、返回信息格式化;
在这里就分别说下几个具体的业务逻辑;
A、请求信息记录—RequestLogFilter
这里的记录接口请求信息,记录下每个接口请求详情,便于查看记录,具体代码:
- public class RequestLogFilterAttribute : ActionFilterAttribute
- {
- private readonly string Key = "_RequestTime_";
- private readonly string Watch = "_Stopwatch_";
- private readonly string Token = ConfigurationManager.AppSettings["Token"].ToString();
- public override void OnActionExecuting(HttpActionContext actionContext)
- {
- base.OnActionExecuting(actionContext);
- Stopwatch stopWatch = new Stopwatch();
- stopWatch.Start();
- actionContext.Request.Properties[Key] = DateTime.Now;
- actionContext.Request.Properties[Watch] = stopWatch;
- }
- public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
- {
- Stopwatch stopWatch = actionExecutedContext.Request.Properties[Watch] as Stopwatch;
- stopWatch.Stop();
- // 如果有该特性就不记录请求记录(绕过记录)
- if (actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<BypassRequestLogFilterAttribute>().Any())
- {
- return;
- }
- // 具体记录接口请求信息
- }
- }
B、模型验证—ValidateModelFilter
这个是模型验证的,对接口的数据有效性进行验证
- public class ValidateModelFilterAttribute : ActionFilterAttribute
- {
- public override void OnActionExecuting(HttpActionContext actionContext)
- {
- if (actionContext.ModelState.IsValid == false)
- {
- List<Dictionary<string, string>> allErrors = new List<Dictionary<string, string>>();
- var modelState = actionContext.ModelState;
- foreach (var key in modelState.Keys)
- {
- Dictionary<string, string> errorDictionary = new Dictionary<string, string>();
- var state = modelState[key];
- string[] errorMessages = state.Errors.Select(t => t.ErrorMessage).ToArray();
- errorDictionary.Add(key, string.Join(",", errorMessages));
- allErrors.Add(errorDictionary);
- }
- ResponseData responseData = new ResponseData { MsgCode = , Message = "参数有误!", Data = allErrors };
- JsonMediaTypeFormatter jsonMediaTypeFormatter = actionContext.Request.GetConfiguration().Formatters.JsonFormatter;
- actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, responseData, jsonMediaTypeFormatter);
- }
- }
- }
C、返回信息格式化—ResponseFormatterFilter
之所以添加这个过滤器是在我们手机端调用接口的时候,发现返回的信息不是定义好的,
是经过了一种格式化,不能按照我们既定的格式进行解析(分析发现,是请求的时候格式化,返回的信息也按照这个格式化),
所以在过滤器里再对全部的返回信息进行格式化:
- public class ResponseFormatterFilterAttribute : ActionFilterAttribute
- {
- public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
- {
- if (actionExecutedContext.Response != null && actionExecutedContext.Response.IsSuccessStatusCode)
- {
- ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
- JsonMediaTypeFormatter jsonMediaTypeFormatter = actionExecutedContext.Request.GetConfiguration().Formatters.JsonFormatter;
- actionExecutedContext.Response = new HttpResponseMessage
- {
- StatusCode = HttpStatusCode.OK,
- Content = new ObjectContent(content.Value.GetType(), content.Value, jsonMediaTypeFormatter)
- };
- }
- }
- }
这几个都是继承自:ActionFilterAttribute,为了比较清晰所以分开放。
对于这种同一级别的过滤器,其执行的先后顺序是:注册在前的先进后出,注册在后的后进先出(大致如下图)
3、异常处理过滤器—ExceptionFilterAttribute
这个是统一处理有异常的过滤器,多错误过滤,返回给客户端的是处理过的,也是最后面一个出去的,过滤器里面有错误也会捕捉到。
具体代码:
- public class ExceptionLogFilterAttribute : ExceptionFilterAttribute
- {
- public override void OnException(HttpActionExecutedContext actionExecutedContext)
- {
- base.OnException(actionExecutedContext);
- JsonMediaTypeFormatter jsonMediaTypeFormatter = actionExecutedContext.Request.GetConfiguration().Formatters.JsonFormatter;
- ResponseData responseData;
- if (actionExecutedContext.Exception is ExceptionEx)
- {
- responseData = new ResponseData { MsgCode = , Message = actionExecutedContext.Exception.Message };
- }
- else
- {
- Exception exceptionData = null;
- if (ConfigurationManager.AppSettings["ApplicationEnvironment"] == ApplicationEnvironmentEnum.Development.ToString())
- {
- exceptionData = actionExecutedContext.Exception;
- }
- responseData = new ResponseData { MsgCode = , Message = "系统内部异常!请联系管理员!", Data = exceptionData };
- }
- actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.BadRequest, responseData, jsonMediaTypeFormatter);
- }
- }
对于不同级别的过滤器,执行顺序是:
AuthenticationFilter > ActionFilterAttribute > ExceptionFilterAttribute
4、IIS WebDAV 模块
在每次发布后,出现一个问题:跨域和Put请求不了。
对于这个问题,是已经配置过的怎么还会出现这个问题。
经过反复的测试,原来是 IIS WebDAV 模块,虽然配置了,IIS 是直接修改 Webconfig 文件的,再次发布覆盖了这个文件原有的配置就没了。
对于这个问题,可以在 Webconfig 文件里面配置上,这样可以。
也可以直接去掉 WebDAV 模块,但是卸载不好卸载。可以在 IIS 站点配置文件里面删除 WebDAV 的配置,这样也可以达到效果。
接口调优——WebAPI 过滤器,IIS WebDAV的更多相关文章
- 记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)
记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的, ...
- [网站性能2]Asp.net平台下网站性能调优的实战方案
文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错, ...
- Asp.net平台下网站性能调优的实战方案(转)
转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来 ...
- 记一次Web服务的性能调优
前言 一个项目在经历开发.测试.上线后,当时的用户规模还比较小,所以刚刚上线的项目一般会表现稳定.但是随着时间的推移,用户数量的增加,qps的增加等因素会造成项目慢慢表现出网页半天无响应的状况.在之前 ...
- 一个简单web系统的接口性能分析及调优过程
在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...
- C# WebApi 过滤器的使用开发接口必备利器
在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...
- Nginx源码安装及调优配置
导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优 ...
- 《深入理解Java虚拟机》-----第5章 jvm调优案例分析与实战
案例分析 高性能硬件上的程序部署策略 例 如 ,一个15万PV/天左右的在线文档类型网站最近更换了硬件系统,新的硬件为4个CPU.16GB物理内存,操作系统为64位CentOS 5.4 , Resin ...
- java大数据量调优
从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要 ...
随机推荐
- stochastic noise and deterministic noise
在机器学习中,导致overfitting的原因之一是noise,这个noise可以分为两种,即stochastic noise,随机噪声来自数据产生过程,比如测量误差等,和deterministic ...
- PMP备考笔记--1.1
题型 200道中英文单选题 基本概念题(%10) 过程工具/技术和输入输出题ITTO (%10) 情景题(%70) 计算题(3-5道题) 图 pmp四大挑战 试卷100页,题干长,阅读量大,考试4个小 ...
- Linux 脚本语言入门
0.脚本编写初步介绍 (1)脚本第一行以 #!/bin/sh 开始,也可以用 #!/bin/bash 开始,但是第一行必须以这种方式开始. (2)脚本名需要以.sh结尾 (3)#开头的句子表示注释 ( ...
- [转帖]linux操作系统测试工具
linux操作系统测试工具 http://cfdtesting.com/879156.html 作者: minions_222 来源: CFDTesting.com采编 发布于: ...
- SQL Server 数据库清空ldf日志文件
USE [master] ALTER DATABASE [DB_Develop] SET RECOVERY SIMPLE WITH NO_WAIT ALTER DATABASE [DB_Develop ...
- 『Python基础』第5节:条件控制
if 语句的使用 单分支 if 条件: 满足条件后要执行的代码 例如: if 2 < 3: print(222) print(333) 每个条件后面都要使用冒号 :, 表示接下来是满足条件后要执 ...
- linux学习之路(三)--centos7安装mysql(单点)
1.先检查系统是否装有mysql rpm -qa | grep mysql 返回空值,说明没有安装. 这里执行安装命令是无效的,因为centos-7默认是Mariadb,所以执行以下命令只是更新Mar ...
- LOJ3049 [十二省联考2019] 字符串问题 【后缀自动机】【倍增】【拓扑排序】
题目分析: 建出后缀自动机,然后把A串用倍增定位到后缀自动机上,再把B串用倍增定位到后缀自动机上. SAM上每个点上的A串根据长度从小到大排序,建点,依次连边. 再对于SAM上面每个点,连到儿子的边, ...
- K380键盘IOS使用
- Broom |tidy up a bit,模型,检验结果一键输出!
本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/TqFk66F2gUu_k8WEjKbLtA 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ...