欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET Core擴展庫之Http通用擴展庫的使用詳解

 更新時間:2021年04月20日 11:33:52   作者:xfrog  
這篇文章主要介紹了ASP.NET Core擴展庫之Http通用擴展庫的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下

    本文將介紹Xfrogcn.AspNetCore.Extensions擴展庫對于Http相關(guān)的其他功能擴展,這些功能旨在處理一些常見需求, 包括請求緩沖、請求頭傳遞、請求頭日志范圍、針對HttpClient與HttpRequestMessage、HttpResponseMessage的擴展方法。

一、開啟服務(wù)端請求緩沖

    ASP.NET Core 中請求體是不能多次讀取的,由于在MVC中,框架已經(jīng)讀取過請求體,如果你在控制器中再次讀取,將會引發(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)通過Post請求/test接口時,語句 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)然,實際中可能不會像示例這樣處理請求,但在業(yè)務(wù)需求中,的確可能會有多次讀取請求體的情況出現(xiàn)。

    通過開啟請求緩沖可以解決多次讀取請求體的問題,Xfrogcn.AspNetCore.Extensions擴展庫提供了EnableBufferingAttribute特性用于開啟請求緩沖,你可以將此特性用于控制器或者Action方法。

    以上示例,只需在Save方法上添加EnableBuffering特性:

    [HttpPost]
    [EnableBuffering]
    public async Task<WeatherForecast> Save([FromBody]WeatherForecast enttiy)
    {
        ....
    }

二、請求頭傳遞

    微服務(wù)架構(gòu)下,通常我們使用請求頭來實現(xiàn)請求的鏈路跟蹤以及日志與請求的關(guān)聯(lián),例如,通過x-request-id,在日志系統(tǒng)中可以直接查看某一個請求在所有服務(wù)中的相關(guān)日志。

    擴展庫通過攔截HttpClient請求管道,可實現(xiàn)對指定請求頭的自動傳遞。默認配置下,擴展庫會自動傳遞以"x-"開始的請求頭,如果你需要傳遞其他的請求頭,可通過配置中的TrackingHeaders來添加。

    IServiceCollection services = new ServiceCollection()
        .AddExtensions(null, config =>
        {
            // 自動傳遞以my-為前綴的請求頭
            config.TrackingHeaders.Add("my-*");
        });

三、請求頭日志的記錄

    .NET Core日志框架中,實現(xiàn)了日志范圍的概念,通過日志范圍,可以讓日志系統(tǒng)記錄當(dāng)前上下文的信息,例如,ASP.NET Core MVC中,日志范圍包含ActionContext相關(guān)信息,故可以在一個請求的所有日志中都可自動記錄Action的相關(guān)信息。

    擴展庫可以將配置的請求頭加入請求的日志范圍,例如,默認配置下,擴展庫會將x-request-id加入到請求的日志范圍,所以在單一請求中的所有日志,都可自動攜帶x-request-id信息,以此實現(xiàn)跨服務(wù)的日志關(guān)聯(lián)。要包含其他的請求頭,可以通過配置中的HttpHeaders來設(shè)置:

    IServiceCollection services = new ServiceCollection()
        .AddExtensions(null, config =>
        {
            // 將my-id請求頭包含到日志范圍
            config.HttpHeaders.Add("my-id");
        });

    注意: 默認的控制臺日志、文件日志不會保存日志范圍的相關(guān)信息,你可以使用json格式的控制臺日志或文件日志,在此格式下將保存日志范圍中的數(shù)據(jù)。

    IServiceCollection services = new ServiceCollection()
        .AddExtensions(null, config =>
        {
            config.ConsoleJsonLog = true;
        });

四、Http消息上的擴展方法

    擴展庫在HttpRequestMessage上提供了GetObjectAsync、WriteObjectAsync擴展方法,以便于對請求消息的讀寫。 在HttpResponseMessage上提供了GetObjectAsync、WriteObjectAsync擴展方法,以便于對應(yīng)答消息的讀寫。這些方法都采用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);

        // 讀取應(yīng)答對象
        entity = await response.GetObjectAsync<WeatherForecast>();

        Console.ReadLine();
    }

五、HttpClient上的擴展方法

    為了更方便快捷地使用HttpClient,擴展庫在HttpClient上增加了多個擴展方法:

  • PostAsync<TResponse>: 發(fā)送對象到服務(wù)端,并獲取指定類型的應(yīng)答
  • PostAsync: 發(fā)送對象到服務(wù)端,并獲取應(yīng)答字符串
  • GetAsync<TResponse>: 發(fā)送Get請求,并獲取TResponse類型的應(yīng)答
  • GetAsync: 發(fā)送Get請求,并獲取String類型的應(yīng)答
  • SubmitFormAsync<TResponse>: 向服務(wù)器提交表單數(shù)據(jù),并獲取TResponse類型的應(yīng)答
  • SubmitFormAsync: 向服務(wù)器提交表單數(shù)據(jù),并獲取String類型的應(yīng)答
  • UploadFileAsync<TResponse>: 上次本地文件
  • UploadStreamAsync<TResponse>: 上傳流數(shù)據(jù)到服務(wù)器

    有關(guān)這些擴展方法的詳細說明,可參考文檔 GitHub Gitee

    Xfrogcn.AspNetCore.Extensions地址:GitHub Gitee

以上就是ASP.NET Core擴展庫之Http通用擴展庫的使用詳解的詳細內(nèi)容,更多關(guān)于ASP.NET Core擴展庫之Http通用擴展庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • asp.net為網(wǎng)頁動態(tài)添加關(guān)鍵詞的方法

    asp.net為網(wǎng)頁動態(tài)添加關(guān)鍵詞的方法

    這篇文章主要介紹了asp.net為網(wǎng)頁動態(tài)添加關(guān)鍵詞的方法,可實現(xiàn)動態(tài)添加keyword meta的功能,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • System.Timers.Timer定時執(zhí)行程序示例代碼

    System.Timers.Timer定時執(zhí)行程序示例代碼

    如果是某個邏輯功能的定時,可以將code放到邏輯功能的類的靜態(tài)構(gòu)造函數(shù)中,在該邏輯類第一次執(zhí)行時,靜態(tài)構(gòu)造函數(shù)會被調(diào)用,則定時自然啟動
    2013-06-06
  • asp.net core調(diào)用wps實現(xiàn)word轉(zhuǎn)pdf的過程

    asp.net core調(diào)用wps實現(xiàn)word轉(zhuǎn)pdf的過程

    這篇文章主要介紹了asp.net core調(diào)用wps實現(xiàn)word轉(zhuǎn)pdf的過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-08-08
  • .NET中的枚舉用法淺析

    .NET中的枚舉用法淺析

    這篇文章主要介紹了.NET中的枚舉用法,分析了枚舉的定義、轉(zhuǎn)換、判定等常見用法,需要的朋友可以參考下
    2015-01-01
  • VS2015下簡單使用EF框架的方法

    VS2015下簡單使用EF框架的方法

    這篇文章主要為大家詳細介紹了VS2015下簡單使用EF框架的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • ASP.NET Core應(yīng)用錯誤處理之三種呈現(xiàn)錯誤頁面的方式

    ASP.NET Core應(yīng)用錯誤處理之三種呈現(xiàn)錯誤頁面的方式

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core應(yīng)用錯誤處理之三種呈現(xiàn)錯誤頁面的方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 用存儲過程向數(shù)據(jù)庫存值的具體實現(xiàn)

    用存儲過程向數(shù)據(jù)庫存值的具體實現(xiàn)

    本文為大家介紹下使用存儲過程向數(shù)據(jù)庫存值的具體實現(xiàn)過程,感興趣的朋友不要錯過
    2014-01-01
  • 詳解ASP.NET Core 中間件之壓縮、緩存

    詳解ASP.NET Core 中間件之壓縮、緩存

    本篇文章主要介紹了ASP.NET Core 中間件之壓縮、緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • C#中使用SQLite數(shù)據(jù)庫的方法介紹

    C#中使用SQLite數(shù)據(jù)庫的方法介紹

    SQLite是一個開源的輕量級的桌面型數(shù)據(jù)庫,它將幾乎所有數(shù)據(jù)庫要素(包括定義、表、索引和數(shù)據(jù)本身)都保存在一個單一的文件中。SQLite用C編寫實現(xiàn),它在內(nèi)存消耗、文件體積、操作性能、簡單性方面都有不錯的表現(xiàn)
    2012-01-01
  • ASP.NET Core中的對象池化技術(shù)詳解

    ASP.NET Core中的對象池化技術(shù)詳解

    這篇文章主要為大家詳細介紹了ASP.NET Core中的對象池化技術(shù)的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01

最新評論