如何測量並報告ASP.NET Core Web API請求的響應時間

来源:https://www.cnblogs.com/yilezhu/archive/2018/08/22/9520808.html
-Advertisement-
Play Games

 如何測量並報告ASP.NET Core Web API請求的響應時間 介紹 大家都知道性能是API的流行語。而相應時間則是API性能的一個重要並且可測量的參數。在本文中,我們將瞭解如何使用代碼來測量API的響應時間,然後將響應時間數據返回到客戶端。 作者:依樂祝 原文地址:https://www ...


如何測量並報告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的客戶端應用程式。
      可能還有其他有用的方法來使用響應時間數據。您可以在評論區進行留言,並告訴我您是如何處理應用程式中的響應時間數據的。

      我們開始寫代碼吧

      我們將按照下麵的處理步驟來進行代碼的編寫。
    5. 計算API的響應時間數據
    6. 通過在響應頭中傳遞數據將數據報告回客戶端應用程式。

    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的響應時間。使用中間件還有其他各種有用的用例,可以幫助重用代碼並提高應用程式的可維護性。
本文翻譯自https://www.c-sharpcorner.com/technologies/Asp-Net-core


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • jsp 內置對象 轉發與重定向的比較 重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。因為,當你使用重定向時,瀏覽器中所顯示的UR ...
  • 所有文章僅是筆記!都是看網上大神或者視頻學習來的。 一、軟體層面機器碼翻譯(為了吹的牛B:write once run everywhere) 二、記憶體管理:java經久不衰的原因之一 ...
  • Python的錯誤異常在大部分IDE編輯器中則可以直接顯示出來,便於開發人員的調試及修改工作,對初學者也比較友好。 Python中包含錯誤和異常兩種情況,錯誤主要是常見的語法錯誤SyntaxError,並且在錯誤提示中會有倒三角箭頭的修改指示位置;python中的另外一種錯誤提醒叫做異常,指的是在語 ...
  • 好,大家好,我是Simon。接下來的時間由我和大家一起學習VC編程。 那麼我們現在的話就是開始去進入實際的一個程式設計階段。 那麼這個的話是說編寫一個全屏截圖工具。那麼這個工具的話就是我們採用一個cimage的一個類。 然後對它進行一個截圖操作。那麼採用這個類的話,主要是方便,然後再說快捷。在這... ...
  • 值類型、引用類型和泛型 多語言 咱們先不說主題,先說說CLR支持多語言。 .net有個非常強大的特點,那就是跨語言,支持很多語言,比如C#、J#等。先來個圖看一看 看到這個圖,每個語言都有自己的編譯器,通過第一次編譯,編譯成中間文件(dll或是exe文件)。在程式運行的時候,再次編譯把中間文件編譯成 ...
  • asp.net core 2.1 部署IIS(win10) 概述 與ASP.NET時代不同,ASP.NET Core不再是由IIS工作進程(w3wp.exe)托管,而是使用自托管Web伺服器(Kestrel)運行,IIS則是作為反向代理的角色轉發請求到Kestrel不同埠的ASP.NET Core ...
  • 1、Parallel.Invoke 主要用於任務的並行 這個函數的功能和Task有些相似,就是併發執行一系列任務,然後等待所有完成。和Task比起來,省略了Task.WaitAll這一步,自然也缺少了Task的相關管理功能。它有兩種形式: Parallel.Invoke( params Action ...
  • ASP.NET Core MVC中所提供的Model Binding功能簡單但實用,其主要目的是將請求中包含的數據映射到action的方法參數中。這樣就避免了開發者像在Web Forms時代那樣需要從Request類中手動獲取數據的繁鎖操作,直接提高了開發效率。此功能繼承自ASP.NET MVC,所 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...