如何测量并报告ASP.NET Core Web API请求的响应时间

简介:

如何测量并报告ASP.NET Core Web API请求的响应时间

介绍

大家都知道性能是API的流行语。而相应时间则是API性能的一个重要并且可测量的参数。在本文中,我们将了解如何使用代码来测量API的响应时间,然后将响应时间数据返回到客户端。

作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9520808.html

1

我们为什么需要测量响应时间

首先,让我们先花一点时间思考下为什么我们需要这么一个特性来测量API的响应时间。下面是编写代码来捕获响应时间的一些场景。

  1. 您需要为您的客户定义API的SLA(服务水平协议)。客户需要了解API响应的时间。响应时间数据可以帮助我们确定API的SLA。
  2. 管理层对报告应用程序的速度快慢感兴趣。您需要有数据来证实您的报告的声明。报告应用程序的性能并与利益相关者进行分享时值得的。
  3. 客户端需要具有API的响应时间的信息,以便它们可以跟踪在客户端和服务器上花费了多少时间。
    您可能在项目中也遇到过类似的请求,因此研究一种捕获API响应时间的方法是值得的。

在哪里添加测量代码?

让我们探索一些方法来捕获API的响应时间,主要集中在捕获API中花费的时间。我们的目标是计算从Asp.net Core运行时接收请求到处理响应并从服务器返回结果所经过的时间(以毫秒为单位)。

我们需要忽略哪些因素?

重要的是要理解这个讨论不包括花在N/W上的时间,以及在IIS和应用程序池启动中花费的时间。如果应用程序池未启动并运行,则第一个请求可能会影响API的总体响应时间。我们可以使用一个应用程序初始化模块,但这超出了本文的范围。

第一次尝试

捕获API响应时间的一种非常异想天开的方法是在开始和结束时向每个API方法添加如下代码,然后测量增量以计算响应时间,如下所示。

// GET api/values/5   
[HttpGet]  
public IActionResult Get() {  
    // Start the watch   
    var watch = new Stopwatch();  
    watch.Start();  
    // Your actual Business logic   
    // End the watch  
    watch.Stop();  
    var responseTimeForCompleteRequest = watch.ElapsedMilliseconds;  
}  

此代码应该能够计算操作所花费的时间。但由于以下原因,这似乎不是正确的方法。

  1. 如果API有很多操作,那么我们需要将这个代码添加到多个不利于可维护性的地方。
  2. 此代码仅测量在方法中花费的时间,它不测量在中间件,过滤器,控制器选择,Action选择,模型绑定等其他活动上花费的时间。

第二次尝试

让我们尝试通过将代码集中在一个地方来改进上面的代码,以便更容易维护。我们需要在执行方法之前和之后执行响应时间的计算代码。如果您使用过早期版本的Asp.net Web API,那么您将熟悉Filter的概念。过滤器允许您在请求处理管道中的特定阶段之前或之后运行代码。

我们将实现一个用于计算响应时间的过滤器,如下所示。我们将创建一个Filter并使用OnActionExecuting启动计时器,然后在方法OnActionExecuted中停止计时器,从而计算API的响应时间。

public class ResponseTimeActionFilter: IActionFilter {  
    private const string ResponseTimeKey = "ResponseTimeKey";  
    public void OnActionExecuting(ActionExecutingContext context) {  
        // Start the timer   
        context.HttpContext.Items[ResponseTimeKey] = Stopwatch.StartNew();  
    }  
    public void OnActionExecuted(ActionExecutedContext context) {  
        Stopwatch stopwatch = (Stopwatch) context.HttpContext.Items[ResponseTimeKey];  
        // Calculate the time elapsed   
        var timeElapsed = stopwatch.Elapsed;  
    }  
}  

此代码不是计算响应时间的可靠技术,因为它没有解决计算执行中间件,控制器选择,操作方法选择,模型绑定等所花费的时间的问题。过滤器管道在MVC选择Action后执行。因此,它实际上无法检测在其他Asp.net管道中花费的时间。

2

第三次尝试

我们将使用Asp.net Core中间件来计算API的响应时间

所以,什么是中间件呢?

基本上,中间件是处理请求/响应的软件组件。中间件被组装到应用程序管道中并在传入请求中提供服务。每个组件执行以下操作。

  1. 选择是否将请求传递给管道中的下一个组件。
  2. 可以在调用管道中的下一个组件之前和之后执行工作。

如果您在ASP.NET中使用过HTTPModules或HTTPHandler,那么您可以将中间件视为ASP.NET Core中的替代品。一些中间件的例子是 :

  • MVC中间件
  • Authentication中间件
  • Static File Serving
  • Caching
  • CORS 等等

3

我们希望在请求进入ASP.NET Core管道后添加代码以启动计时器,并在管道处理响应后停止计时器。请求管道开始时的自定义中间件似乎是访问请求最早访问并在管道中执行最后一步之前进行访问的最佳方法。

我们将构建一个响应时间中间件,我们将其作为第一个中间件添加到请求管道中,以便我们可以在请求进入Asp.net Core管道后立即启动计时器。

### 如何处理响应时间数据呢?
一旦我们捕获到响应时间数据,我们就可以通过以下方式来进行数据的处理。

  1. 将响应时间数据添加到报告数据库或分析解决方案。
  2. 将响应时间数据写入日志文件。
  3. 将响应时间数据传递到消息队列,该消息队列可以由另一个应用程序进一步处理以进行报告和分析。
  4. 使用响应头将响应时间信息发送到使用我们的Rest API的客户端应用程序。
    可能还有其他有用的方法来使用响应时间数据。您可以在评论区进行留言,并告诉我您是如何处理应用程序中的响应时间数据的。

### 我们开始写代码吧
我们将按照下面的处理步骤来进行代码的编写。

  1. 计算API的响应时间数据
  2. 通过在响应头中传递数据将数据报告回客户端应用程序。

ResponseTimeMiddleware的完整代码片段如下所示:

public class ResponseTimeMiddleware {  
    // Name of the Response Header, Custom Headers starts with "X-"  
    private const string RESPONSE_HEADER_RESPONSE_TIME = "X-Response-Time-ms";  
    // Handle to the next Middleware in the pipeline  
    private readonly RequestDelegate _next;  
    public ResponseTimeMiddleware(RequestDelegate next) {  
        _next = next;  
    }  
    public Task InvokeAsync(HttpContext context) {  
        // Start the Timer using Stopwatch  
        var watch = new Stopwatch();  
        watch.Start();  
        context.Response.OnStarting(() => {  
            // Stop the timer information and calculate the time   
            watch.Stop();  
            var responseTimeForCompleteRequest = watch.ElapsedMilliseconds;  
            // Add the Response time information in the Response headers.   
            context.Response.Headers[RESPONSE_HEADER_RESPONSE_TIME] = responseTimeForCompleteRequest.ToString();  
            return Task.CompletedTask;  
        });  
        // Call the next delegate/middleware in the pipeline   
        return this._next(context);  
    }  
}  

代码说明

主要的代码是在InvokeAsync方法中,一旦请求进入到第一个中间件,我们使用秒表类来启动秒表,然后在处理请求完成后并且响应准备好返回给客户端的Response后停止秒表。OnStarting方法提供了编写自定义代码的机会,以便在将响应头发送到客户端之前添加要调用的委托中。
最后,我们在自定义标题中添加响应时间信息。我们使用X-Response-Time-ms标头作为响应标头。作为惯例,自定义标题以X开头。

总结

在本文中,我们了解了如何利用ASP.NET中间件来管理跨领域问题,例如测量API的响应时间。使用中间件还有其他各种有用的用例,可以帮助重用代码并提高应用程序的可维护性。

目录
相关文章
|
5天前
|
开发框架 JSON API
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
【7月更文挑战第22天】在Python Web开发中,设计高效的RESTful API涉及选择框架(如Flask或Django)、明确资源及使用HTTP方法(GET, POST, PUT, DELETE)来操作数据。响应格式通常是JSON,错误处理也很重要。示例展示了使用Flask创建图书管理API,包括版本控制、文档化、安全性和性能优化是最佳实践。这样的API使数据交互更顺畅。
26 2
|
2天前
|
JSON API 开发者
惊!Python Web开发新纪元,RESTful API设计竟能如此性感撩人?
【7月更文挑战第24天】在 Python Web 开发领域, RESTful API 设计成为一种艺术, 关注用户体验与开发者友好性。
19 7
|
3天前
|
JSON API 数据格式
深度剖析!Python Web 开发中 RESTful API 的每一个细节,你不可不知的秘密!
【7月更文挑战第23天】在Python Web开发中,RESTful API利用HTTP协议构建强大、灵活的应用。GET获取资源,如`/products/:id`;POST创建新资源;PUT更新;DELETE删除。正确使用状态码,如200、201、404、500,至关重要。JSON化数据与版本控制(如`/v1/products`)增强API实用性。认证(OAuth, JWT)保障安全性,而清晰的错误消息提升用户体验。掌握这些细节,方能设计出高性能、易用的RESTful API。
20 7
|
2天前
|
SQL API 网络架构
Pythoner必看!RESTful API设计秘籍,让你的Web应用瞬间高大上!
【7月更文挑战第24天】在 Python Web 开发中, RESTful API 设计至关重要, 它不仅展现技术实力, 更提升应用的可维护性与用户体验。
16 5
|
2天前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
【7月更文挑战第24天】在Python的Web开发领域,掌握RESTful API至关重要。利用Flask框架,可迅速搭建API,进行用户管理的CRUD操作。需先安装Flask (`pip install Flask`),然后定义路由处理GET、POST、PUT、DELETE请求,实现用户数据的检索、创建、更新和删除。
19 5
|
4天前
|
API 数据安全/隐私保护 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
【7月更文挑战第23天】Python的RESTful API设计在Web开发中流行,提升效率与体验。REST强调HTTP方法(GET, POST, PUT, DELETE)操作资源。使用Flask框架可快速实现API,如管理用户信息。示例代码展示如何创建、读取、更新和删除用户,通过不同HTTP方法和URL路径。实际应用中,增加验证、错误处理和权限控制可增强API的安全性和稳定性。安装Flask后,可运行代码测试API功能。
24 6
|
2天前
|
JSON API 网络架构
揭秘!Python Web框架下的RESTful API设计,为何成为互联网新宠?
【7月更文挑战第24天】在互联网快速发展背景下,RESTful API以其简洁性和可扩展性成为应用间通信的首选。REST强调资源为核心,利用HTTP方法处理CRUD操作,促进前后端分离,提高开发效率。Python的Flask框架支持轻松构建RESTful API,通过路由、请求和响应机制实现。示例代码展示了如何使用Flask创建、读取和更新用户信息。Python Web框架因其丰富的工具和库,简化RESTful API开发,适应微服务架构需求,在互联网发展中扮演重要角色。
|
5天前
|
安全 API 网络架构
Python RESTful API设计新篇章,打造高效、易用、安全的Web服务接口,你准备好了吗?
【7月更文挑战第22天】在数字化转型中,RESTful API借助Python的Flask和Django REST Framework,提供高效、易用和安全的接口设计。Flask示例展示了简洁的CRUD操作,Swagger等工具增进API文档的易用性,而HTTPS、JWT和输入验证确保安全性。Python RESTful API设计涉及效率、可用性和安全,是不断进化的Web服务接口的关键。准备好踏上这一新篇章了吗?一起探索,创造卓越!
|
12天前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
【7月更文挑战第15天】AJAX和Fetch API是Web开发中的关键工具,用于异步前后端交互。AJAX借助XMLHttpRequest实现页面局部更新,而Fetch API是现代的、基于Promise的HTTP请求接口,提供更强大功能和简洁语法。结合Python Web框架如Django或Flask,利用这两者能创造无缝体验,提升项目性能和用户体验。学习并应用这些技术,将使你的Web应用焕发新生。**
21 5
|
13天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
【7月更文挑战第13天】在Web开发中,AJAX和Fetch API是实现页面无刷新数据交换的关键。在Flask博客系统中,通过创建获取评论的GET路由,我们可以展示使用AJAX和Fetch API的前端实现。AJAX通过XMLHttpRequest发送请求,处理响应并在成功时更新DOM。Fetch API则使用Promise简化异步操作,代码更现代。这两个工具都能实现不刷新页面查看评论,Fetch API的语法更简洁,错误处理更直观。掌握这些技巧能提升Python Web项目的用户体验和开发效率。
26 7