使用HttpClient發出HTTP請求

在應用程式中以HTTP方式傳送Request及接收Response

可以透過HttpClient這個類別,在開發程式時針對欲訪問的URI,以HTTP方式傳送Request及接收Response。

HttpClient只需實體化一次,就可以發送多個請求,官方建議以static方式共用,不須使用using()來釋放連線。

static readonly HttpClient client = new HttpClient();

static async Task Main()
{    
    try	
    {
        HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();        

        Console.WriteLine(responseBody);
    }
    catch(HttpRequestException e)
    {
        Console.WriteLine("\nException Caught!");	
        Console.WriteLine("Message :{0} ",e.Message);
    }
}

不過HttpClient只會在建立連線時解析DNS專案,無法即時反應DNS的異動,可以透過PooledConnectionIdleTimeout來限制連線的存活時間,以利重新解析DNS。

或是使用ASP.NET Core 2.1 / .NET 4.6 起推出的 HttpClientFactory,可藉由Connection Pool解決連線共用及DNS 異動的問題。

以下參考在 ASP.NET Core 中使用 IHttpClientFactory 發出 HTTP 要求的基本使用方法

版本:.NET Core 3.1

  1. Startup.cs裡註冊服務

    IHttpClientFactory可以藉由呼叫 AddHttpClient來註冊:

    public class Startup
    {    
    	public void ConfigureServices(IServiceCollection services)
    	{
    		services.AddHttpClient();
    	}
    }
    
  2. 在Class中透過相依性注入IHttpClientFactory

    public class BasicUsageModel : PageModel
    {
        private readonly IHttpClientFactory _clientFactory;
    
        public BasicUsageModel(IHttpClientFactory clientFactory)
        {
            _clientFactory = clientFactory;
        }	
    }
    
  3. 使用CreateClient方法取得HttpClient執行個體

    public async Task OnGet()
    {
        var request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.github.com/repos/dotnet/AspNetCore.Docs/branches");
    
        var client = _clientFactory.CreateClient();
    
        var response = await client.SendAsync(request);        
    }
    

🎯Reference

微軟官方文件

在 ASP.NET Core 中使用 IHttpClientFactory 發出 HTTP 要求

使用 HttpClientFactory 實作復原 HTTP 要求

HttpClient,該 using 還是 static?

在 .NET Core 與 .NET Framework 上使用 HttpClientFactory

HttpClient 無法反應 DNS 異動的解決方式

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy