ASP.NET Core擴展庫之Http通用擴展庫的使用詳解
本文將介紹Xfrogcn.AspNetCore.Extensions擴展庫對於Http相關的其他功能擴展,這些功能旨在處理一些常見需求, 包括請求緩沖、請求頭傳遞、請求頭日志范圍、針對HttpClient與HttpRequestMessage、HttpResponseMessage的擴展方法。
一、開啟服務端請求緩沖
ASP.NET Core 中請求體是不能多次讀取的,由於在MVC中,框架已經讀取過請求體,如果你在控制器中再次讀取,將會引發異常,如下示例:
[ApiController] [Route("[controller]")] public class TestController : ControllerBase { public TestController() { } [HttpPost] public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy) { using (StreamReader reader = new StreamReader(Request.Body)) { Request.Body.Position = 0; string response = await reader.ReadToEndAsync(); } return enttiy; } }
當通過Post請求/test接口時,語句 Request.Body.Position 將觸發異常:
System.NotSupportedException: Specified method is not supported. at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.set_Position(Int64 value)
當然,實際中可能不會像示例這樣處理請求,但在業務需求中,的確可能會有多次讀取請求體的情況出現。
通過開啟請求緩沖可以解決多次讀取請求體的問題,Xfrogcn.AspNetCore.Extensions擴展庫提供瞭EnableBufferingAttribute特性用於開啟請求緩沖,你可以將此特性用於控制器或者Action方法。
以上示例,隻需在Save方法上添加EnableBuffering特性:
[HttpPost] [EnableBuffering] public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy) { .... }
二、請求頭傳遞
微服務架構下,通常我們使用請求頭來實現請求的鏈路跟蹤以及日志與請求的關聯,例如,通過x-request-id,在日志系統中可以直接查看某一個請求在所有服務中的相關日志。
擴展庫通過攔截HttpClient請求管道,可實現對指定請求頭的自動傳遞。默認配置下,擴展庫會自動傳遞以”x-“開始的請求頭,如果你需要傳遞其他的請求頭,可通過配置中的TrackingHeaders來添加。
IServiceCollection services = new ServiceCollection() .AddExtensions(null, config => { // 自動傳遞以my-為前綴的請求頭 config.TrackingHeaders.Add("my-*"); });
三、請求頭日志的記錄
.NET Core日志框架中,實現瞭日志范圍的概念,通過日志范圍,可以讓日志系統記錄當前上下文的信息,例如,ASP.NET Core MVC中,日志范圍包含ActionContext相關信息,故可以在一個請求的所有日志中都可自動記錄Action的相關信息。
擴展庫可以將配置的請求頭加入請求的日志范圍,例如,默認配置下,擴展庫會將x-request-id加入到請求的日志范圍,所以在單一請求中的所有日志,都可自動攜帶x-request-id信息,以此實現跨服務的日志關聯。要包含其他的請求頭,可以通過配置中的HttpHeaders來設置:
IServiceCollection services = new ServiceCollection() .AddExtensions(null, config => { // 將my-id請求頭包含到日志范圍 config.HttpHeaders.Add("my-id"); });
註意: 默認的控制臺日志、文件日志不會保存日志范圍的相關信息,你可以使用json格式的控制臺日志或文件日志,在此格式下將保存日志范圍中的數據。
IServiceCollection services = new ServiceCollection() .AddExtensions(null, config => { config.ConsoleJsonLog = true; });
四、Http消息上的擴展方法
擴展庫在HttpRequestMessage上提供瞭GetObjectAsync、WriteObjectAsync擴展方法,以便於對請求消息的讀寫。 在HttpResponseMessage上提供瞭GetObjectAsync、WriteObjectAsync擴展方法,以便於對應答消息的讀寫。這些方法都采用json格式。
示例:
public class WeatherForecast { public DateTime Date { get; set; } public int TemperatureC { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); public string Summary { get; set; } }
static async Task Main(string[] args) { IServiceCollection services = new ServiceCollection() .AddExtensions(null, config => { }); IServiceProvider serviceProvider = services.BuildServiceProvider(); IHttpClientFactory factory = serviceProvider.GetRequiredService<IHttpClientFactory>(); HttpClient client = factory.CreateClient(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5000/test"); // 寫入請求對象 await request.WriteObjectAsync(new WeatherForecast() { Date = DateTime.Now }); request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); // 讀取請求對象 var entity = await request.GetObjectAsync<WeatherForecast>(); HttpResponseMessage response = await client.SendAsync(request); // 讀取應答對象 entity = await response.GetObjectAsync<WeatherForecast>(); Console.ReadLine(); }
五、HttpClient上的擴展方法
為瞭更方便快捷地使用HttpClient,擴展庫在HttpClient上增加瞭多個擴展方法:
- PostAsync<TResponse>: 發送對象到服務端,並獲取指定類型的應答
- PostAsync: 發送對象到服務端,並獲取應答字符串
- GetAsync<TResponse>: 發送Get請求,並獲取TResponse類型的應答
- GetAsync: 發送Get請求,並獲取String類型的應答
- SubmitFormAsync<TResponse>: 向服務器提交表單數據,並獲取TResponse類型的應答
- SubmitFormAsync: 向服務器提交表單數據,並獲取String類型的應答
- UploadFileAsync<TResponse>: 上次本地文件
- UploadStreamAsync<TResponse>: 上傳流數據到服務器
有關這些擴展方法的詳細說明,可參考文檔 GitHub Gitee
Xfrogcn.AspNetCore.Extensions地址:GitHub Gitee
以上就是ASP.NET Core擴展庫之Http通用擴展庫的使用詳解的詳細內容,更多關於ASP.NET Core擴展庫之Http通用擴展庫的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- None Found