ASP.NET Core擴(kuò)展庫(kù)之Http通用擴(kuò)展庫(kù)的使用詳解
本文將介紹Xfrogcn.AspNetCore.Extensions擴(kuò)展庫(kù)對(duì)于Http相關(guān)的其他功能擴(kuò)展,這些功能旨在處理一些常見(jiàn)需求, 包括請(qǐng)求緩沖、請(qǐng)求頭傳遞、請(qǐng)求頭日志范圍、針對(duì)HttpClient與HttpRequestMessage、HttpResponseMessage的擴(kuò)展方法。
一、開(kāi)啟服務(wù)端請(qǐng)求緩沖
ASP.NET Core 中請(qǐng)求體是不能多次讀取的,由于在MVC中,框架已經(jīng)讀取過(guò)請(qǐng)求體,如果你在控制器中再次讀取,將會(huì)引發(fā)異常,如下示例:
[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;
}
}
當(dāng)通過(guò)Post請(qǐng)求/test接口時(shí),語(yǔ)句 Request.Body.Position 將觸發(fā)異常:
System.NotSupportedException: Specified method is not supported. at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.set_Position(Int64 value)
當(dāng)然,實(shí)際中可能不會(huì)像示例這樣處理請(qǐng)求,但在業(yè)務(wù)需求中,的確可能會(huì)有多次讀取請(qǐng)求體的情況出現(xiàn)。
通過(guò)開(kāi)啟請(qǐng)求緩沖可以解決多次讀取請(qǐng)求體的問(wèn)題,Xfrogcn.AspNetCore.Extensions擴(kuò)展庫(kù)提供了EnableBufferingAttribute特性用于開(kāi)啟請(qǐng)求緩沖,你可以將此特性用于控制器或者Action方法。
以上示例,只需在Save方法上添加EnableBuffering特性:
[HttpPost]
[EnableBuffering]
public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy)
{
....
}
二、請(qǐng)求頭傳遞
微服務(wù)架構(gòu)下,通常我們使用請(qǐng)求頭來(lái)實(shí)現(xiàn)請(qǐng)求的鏈路跟蹤以及日志與請(qǐng)求的關(guān)聯(lián),例如,通過(guò)x-request-id,在日志系統(tǒng)中可以直接查看某一個(gè)請(qǐng)求在所有服務(wù)中的相關(guān)日志。
擴(kuò)展庫(kù)通過(guò)攔截HttpClient請(qǐng)求管道,可實(shí)現(xiàn)對(duì)指定請(qǐng)求頭的自動(dòng)傳遞。默認(rèn)配置下,擴(kuò)展庫(kù)會(huì)自動(dòng)傳遞以"x-"開(kāi)始的請(qǐng)求頭,如果你需要傳遞其他的請(qǐng)求頭,可通過(guò)配置中的TrackingHeaders來(lái)添加。
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
// 自動(dòng)傳遞以my-為前綴的請(qǐng)求頭
config.TrackingHeaders.Add("my-*");
});
三、請(qǐng)求頭日志的記錄
.NET Core日志框架中,實(shí)現(xiàn)了日志范圍的概念,通過(guò)日志范圍,可以讓日志系統(tǒng)記錄當(dāng)前上下文的信息,例如,ASP.NET Core MVC中,日志范圍包含ActionContext相關(guān)信息,故可以在一個(gè)請(qǐng)求的所有日志中都可自動(dòng)記錄Action的相關(guān)信息。
擴(kuò)展庫(kù)可以將配置的請(qǐng)求頭加入請(qǐng)求的日志范圍,例如,默認(rèn)配置下,擴(kuò)展庫(kù)會(huì)將x-request-id加入到請(qǐng)求的日志范圍,所以在單一請(qǐng)求中的所有日志,都可自動(dòng)攜帶x-request-id信息,以此實(shí)現(xiàn)跨服務(wù)的日志關(guān)聯(lián)。要包含其他的請(qǐng)求頭,可以通過(guò)配置中的HttpHeaders來(lái)設(shè)置:
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
// 將my-id請(qǐng)求頭包含到日志范圍
config.HttpHeaders.Add("my-id");
});
注意: 默認(rèn)的控制臺(tái)日志、文件日志不會(huì)保存日志范圍的相關(guān)信息,你可以使用json格式的控制臺(tái)日志或文件日志,在此格式下將保存日志范圍中的數(shù)據(jù)。
IServiceCollection services = new ServiceCollection()
.AddExtensions(null, config =>
{
config.ConsoleJsonLog = true;
});
四、Http消息上的擴(kuò)展方法
擴(kuò)展庫(kù)在HttpRequestMessage上提供了GetObjectAsync、WriteObjectAsync擴(kuò)展方法,以便于對(duì)請(qǐng)求消息的讀寫(xiě)。 在HttpResponseMessage上提供了GetObjectAsync、WriteObjectAsync擴(kuò)展方法,以便于對(duì)應(yīng)答消息的讀寫(xiě)。這些方法都采用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");
// 寫(xiě)入請(qǐng)求對(duì)象
await request.WriteObjectAsync(new WeatherForecast()
{
Date = DateTime.Now
});
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
// 讀取請(qǐng)求對(duì)象
var entity = await request.GetObjectAsync<WeatherForecast>();
HttpResponseMessage response = await client.SendAsync(request);
// 讀取應(yīng)答對(duì)象
entity = await response.GetObjectAsync<WeatherForecast>();
Console.ReadLine();
}
五、HttpClient上的擴(kuò)展方法
為了更方便快捷地使用HttpClient,擴(kuò)展庫(kù)在HttpClient上增加了多個(gè)擴(kuò)展方法:
- PostAsync<TResponse>: 發(fā)送對(duì)象到服務(wù)端,并獲取指定類(lèi)型的應(yīng)答
- PostAsync: 發(fā)送對(duì)象到服務(wù)端,并獲取應(yīng)答字符串
- GetAsync<TResponse>: 發(fā)送Get請(qǐng)求,并獲取TResponse類(lèi)型的應(yīng)答
- GetAsync: 發(fā)送Get請(qǐng)求,并獲取String類(lèi)型的應(yīng)答
- SubmitFormAsync<TResponse>: 向服務(wù)器提交表單數(shù)據(jù),并獲取TResponse類(lèi)型的應(yīng)答
- SubmitFormAsync: 向服務(wù)器提交表單數(shù)據(jù),并獲取String類(lèi)型的應(yīng)答
- UploadFileAsync<TResponse>: 上次本地文件
- UploadStreamAsync<TResponse>: 上傳流數(shù)據(jù)到服務(wù)器
有關(guān)這些擴(kuò)展方法的詳細(xì)說(shuō)明,可參考文檔 GitHub Gitee
Xfrogcn.AspNetCore.Extensions地址:GitHub Gitee
以上就是ASP.NET Core擴(kuò)展庫(kù)之Http通用擴(kuò)展庫(kù)的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于A(yíng)SP.NET Core擴(kuò)展庫(kù)之Http通用擴(kuò)展庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ASP.NET:設(shè)置頁(yè)面buffer引出來(lái)的問(wèn)題
ASP.NET:設(shè)置頁(yè)面buffer引出來(lái)的問(wèn)題...2006-09-09
Asp.net內(nèi)置對(duì)象之Request對(duì)象(概述及應(yīng)用)
Request對(duì)象主要用于獲取來(lái)自客戶(hù)端的數(shù)據(jù),如用戶(hù)填入表單的數(shù)據(jù)、保存在客戶(hù)端的Cookie等,本文將圍繞Request對(duì)象,講解其的主要作用:讀取窗體變量、讀取查詢(xún)字符串變量、取得Web服務(wù)器端的系統(tǒng)信息。取得客戶(hù)端瀏覽器信息等等,感興趣的朋友可以了解下2013-02-02
asp.net 簡(jiǎn)便無(wú)刷新文件上傳系統(tǒng)
之前寫(xiě)過(guò)一個(gè)仿163網(wǎng)盤(pán)無(wú)刷新多文件上傳系統(tǒng),已經(jīng)對(duì)無(wú)刷新上傳文件的原理做了詳細(xì)的分析而這次的系統(tǒng)主要是針對(duì)單個(gè)file控件的,便攜版,使用更簡(jiǎn)單,還有更深入的分析2012-05-05
.NET5修改配置不重啟自動(dòng)生效的實(shí)現(xiàn)
.NET Core,.NET5默認(rèn)配置都是只加載一次,修改配置時(shí)都需要重啟才能生效,如何能修改即時(shí)生效呢,本文就來(lái)介紹一下2021-09-09
DataAdapter執(zhí)行批量更新的實(shí)例代碼
這篇文章介紹了DataAdapter執(zhí)行批量更新的實(shí)例代碼,有需要的朋友可以參考一下,希望對(duì)你有所幫助2013-07-07
asp.net 動(dòng)態(tài)創(chuàng)建TextBox控件及狀態(tài)數(shù)據(jù)如何加載
接著上文Asp.net TextBox的TextChanged事件你真的清楚嗎?這里我們來(lái)說(shuō)說(shuō)狀態(tài)數(shù)據(jù)時(shí)如何加載的,需要的朋友可以參考下2012-12-12

