中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在ASP.NET中使用Http通用擴展庫

發布時間:2021-05-11 15:17:17 來源:億速云 閱讀:148 作者:Leah 欄目:開發技術

怎么在ASP.NET中使用Http通用擴展庫?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

ASP.NET 是什么

ASP.NET 是開源,跨平臺,高性能,輕量級的 Web 應用構建框架,常用于通過 HTML、CSS、JavaScript 以及服務器腳本來構建網頁和網站。

一、開啟服務端請求緩沖

    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>: 上傳流數據到服務器

看完上述內容,你們掌握怎么在ASP.NET中使用Http通用擴展庫的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荣昌县| 麻阳| 松阳县| 文登市| 延吉市| 韶山市| 含山县| 通海县| 张家界市| 珲春市| 中卫市| 福州市| 华阴市| 衡水市| 翁牛特旗| 临高县| 大兴区| 锡林郭勒盟| 临武县| 黄龙县| 石屏县| 靖边县| 巫溪县| 新建县| 太仓市| 景谷| 汉中市| 汉源县| 东安县| 通州市| 喀什市| 海丰县| 金坛市| 纳雍县| 阿荣旗| 古浪县| 阿拉善右旗| 蒙自县| 阳高县| 屏南县| 遂溪县|