.net webapi action拦截器 统计action耗时

本文介绍了一种在ASP.NET Web API中使用Stopwatch组件进行性能监控的方法。通过在执行action前后启动和停止计时器,可以精确测量每个请求的处理时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//执行action前执行这个方法
public override void OnActionExecuting(HttpActionContext filterContext)
{
      //用于计算消耗时间
      var stopWatch = new Stopwatch();
      filterContext.Request.Properties[Key] = stopWatch;
      stopWatch.Start();
}
//执行action后执行这个方法
public override void OnActionExecuted(HttpActionExecutedContext filterContext)
{
      var stopWatch = filterContext.Request.Properties[Key] as Stopwatch;
      if (stopWatch != null)
      {
           stopWatch.Stop();
           TimeSpan time = stopWatch.Elapsed;
      }
}

 

转载于:https://www.cnblogs.com/jianghaidong/p/9541851.html

### Java Web 中过滤器和拦截器的区别及使用场景 #### 一、定义与基本概念 过滤器(Filter)和拦截器(Interceptor)都是用于对请求或响应进行预处理或后处理的工具。然而,两者的实现方式以及适用范围存在明显差异。 - **过滤器** 是 Servlet 容器的一部分,它基于函数回调机制工作,并且依赖于 Servlet 容器的支持[^1]。 - **拦截器** 则是 Spring 框架提供的一种功能扩展机制,主要利用 Java 的反射机制来实现动态代理[^3]。 --- #### 二、技术特性对比 | 特性 | 过滤器 (Filter) | 拦截器 (Interceptor) | |-------------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | **基础原理** | 基于函数回调机制 | 基于 Java 反射机制 | | **依赖环境** | 需要依赖 Servlet 容器 | 不依赖 Servlet 容器,仅需 Spring 容器 | | **作用范围** | 对几乎所有类型的 HTTP 请求生效 | 主要针对 Action 类型的请求有效 | | **可访问的内容** | 无法直接访问 Action 上下文 | 能够访问 Action 上下文及相关对象 | | **生命周期调用次数** | 在容器启动时加载并初始化一次 | 在每次请求中都可以被多次调用 | | **与其他组件集成能力** | 无法直接获取 IOC 容器中的 Bean | 支持从 IOC 容器中获取其他 Bean 并与其协作 | 上述表格总结了两者的主要区别[^5]。 --- #### 三、典型应用场景分析 ##### 1. **过滤器的应用场景** - 设置统一的字符集编码。 - 统计网站在线人数或记录用户行为数据。 - 清理过期 Session 或管理会话状态。 - 实现 URL 级别的权限控制。 - 处理跨域资源共享(CORS)问题。 - 压缩响应内容以减少带宽消耗。 示例代码展示如何设置字符集编码: ```java @WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = {"/*"}) public class CharacterEncodingFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); chain.doFilter(request, response); } } ``` --- ##### 2. **拦截器的应用场景** - 用户身份验证:判断当前用户是否已登录。 - 权限校验:确认用户是否有权执行特定操作。 - 日志记录:捕获方法调用前后的时间戳以便后续审。 - 数据转换:在进入 Controller 方法之前完成参数解析或封装。 - 性能监控:算每个请求耗时并生成性能报告。 下面是一个简单的拦截器配置实例: ```java @Component public class AuthInterceptor extends HandlerInterceptorAdapter { @Autowired private UserService userService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (!userService.validateToken(token)) { // 自定义服务层逻辑 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } return true; // 如果认证成功,则继续向下传递请求 } } @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/login"); } } ``` --- #### 四、选择依据 当决定采用过滤器还是拦截器时,应考虑以下几个方面: - 若目标是对整个系统的全局性任务进行优化,比如统一修改字符编码或者清理无用资源,那么优先选用过滤器[^4]。 - 如果涉及更复杂的业务逻辑,尤其是需要频繁交互 Spring 容器内的组件和服务时,建议使用拦截器。 --- #### 结论 综上所述,虽然过滤器和拦截器都能起到类似的作用——即干预请求流程,但其背后的技术支撑完全不同。开发者应当根据实际需求合理选取合适的方案。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值