Asp.net core 學習筆記 ( HttpClient )

2017-09-25 

core 和 .net 4.5 一樣都可以使用 HttpClient 

沒什麼特別的, 只是在學習的時候發現一個之前沒留意到的問題. 

refer : 

https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

http://byterot.blogspot.my/2016/07/singleton-httpclient-dns.html

http://www.cnblogs.com/dudu/p/csharp-httpclient-attention.html

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

http://www.cnblogs.com/Wddpct/p/6229090.html

大致上說的是, HttpClient 不要使用 using, 因為它並不會釋放 TCP 連線, 應該在整個應用裡把 HttpClient 設定成單列 

 

core 要設定單列物件很容易 

public class VisautoHttpClient : HttpClient
{
    public VisautoHttpClient()
    {
        BaseAddress = new Uri("http://visauto.stooges.com.my");
        Timeout = TimeSpan.FromSeconds(30);
        DefaultRequestHeaders.Clear();
        DefaultRequestHeaders.Add("Accept", "text/html");
        DefaultRequestHeaders.Connection.Add("Keep-Alive"); 
    } 
}

定義好類, 由於每個 TCP 的 baseAddress 不能換的,所以如果你有很多個不同區的請求要發, 那麼建議開多幾個 HttpClient 例項.

keep-alive 的目的是讓服務端知道我們的連線不要馬上斷開, 這樣發多個請求的話可以快一些. 

然後在 startup.cs 提供服務就可以了. 

public void ConfigureServices(IServiceCollection services)
{ 
    // services 
    services.AddSingleton<VisautoHttpClient, VisautoHttpClient>();
}

core 會幫我們搞定 singleton 的執行緒安全等問題. 不需要像從前還要用 lock 什麼的那麼麻煩了.

而且這裡只是定義,一直到控制器注入時才會初始化例項哦.

在控制器注入了就可以發請求咯~

[Area("Web")]
public class HttpController : Controller
{
    public HttpController(
        VisautoHttpClient httpClient 
    )
    {
        this.httpClient = httpClient;
    }

    private HttpClient httpClient { get; set; }
        

    [Route("http")]
    public async Task<IActionResult> Index()
    {
        try
        {
            string x = await httpClient.GetStringAsync("");
        }
        catch (Exception ex)
        {

        }
        return View();
    }
}

 

note : 如果伺服器 restart, 我們的連線並不需要任何處理, 都是自動的. 放心, dns 的問題我沒有遇到, 遇到了才打算唄. 

 

關鍵詞:httpclient public core http com visautohttpclient net 學習 可以 html

相關推薦:

@RequestBody和@ResponseBody的使用情形以及RestTemplate的http報文轉換

通過HttpClient來呼叫Web Api介面

基於.NET Core 框架搭建WebApi專案

(43)C#網路1

Java網路爬蟲Hello world實現——Httpclient爬取百度首頁

HttpClientHelper

HttpClient簡單操作

http請求,HttpClient,呼叫簡訊介面

C# httpclient獲取cookies實現模擬web登入

HttpClient(一)HttpClient抓取網頁基本資訊