一、Http請求與響應
Http是一種應用層協議,它是客戶端與服務器之間進行數據交互的一種方式。而System.Net.Http則是提供了一組類庫讓開發人員可以更簡單地完成Http請求和響應。
在HttpClient中,可以通過創建HttpClient實例來發送Http請求,然後可以通過HttpResponseMessage處理返回的響應。下面是一個簡單的示例:
using System; using System.Net.Http; class Program { static async Task Main(string[] args) { using var client = new HttpClient(); using var response = await client.GetAsync("https://jsonplaceholder.typicode.com/posts/1"); using var content = response.Content; var result = await content.ReadAsStringAsync(); Console.WriteLine(result); } }
在上面這個示例中,我們創建了一個HttpClient實例,然後調用了GetAsync方法向指定Url發起Get請求,並使用ReadAsStringAsync方法將響應內容以字符串形式讀取。這是我們經常使用的Http操作之一。
二、異步與同步
在HttpClient中,異步操作是首選,這種操作方式可以提高應用程序的性能,因為這樣就不會阻塞進程的執行。每當在HttpClient上執行異步操作時,都會返回一個代表操作的Task或ValueTask。
HttpClient的所有異步方法都有對應的同步方法。但是,使用同步方法來訪問Http資源可能會阻塞當前線程。這在Web應用程序中是一個大問題,因為一個單獨的線程可以處理多個並發請求。因此建議在HttpClient中使用異步操作。
三、Http請求頭和消息體
在HttpClient中,可以設置請求的Http頭和消息體。可以通過HttpHeaders類來設置Http請求頭,如下所示:
using System.Net.Http.Headers; class Program { static async Task Main(string[] args) { using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Get, "https://jsonplaceholder.typicode.com/posts/1"); request.Headers.Add("User-Agent", "HttpClientGetRequest"); using var response = await client.SendAsync(request); using var content = response.Content; var result = await content.ReadAsStringAsync(); Console.WriteLine(result); } }
在上面的示例中,我們在請求頭中添加了一個”User-Agent”鍵,並將其值設置為”HttpClientGetRequest”。在實際場景中,我們可以設置更多的請求頭參數。
另外,可以通過設置HttpContent的屬性傳遞消息正文。HttpContent是一個抽象基類,其具體實現包括StringContent、ByteArrayContent、StreamContent、FormUrlEncodedContent和MultipartFormDataContent。下面是一個使用FormUrlEncodedContent的示例:
using System.Net.Http.Headers; class Program { static async Task Main(string[] args) { using var client = new HttpClient(); using var content = new FormUrlEncodedContent(new Dictionary<string, string> { {"key1", "value1"}, {"key2", "value2"} }); using var response = await client.PostAsync("http://example.com/upload", content); using var responseContent = response.Content; var result = await responseContent.ReadAsStringAsync(); Console.WriteLine(result); } }
上面的代碼是一個Post請求,請求正文是一個鍵值對,通過FormUrlEncodedContent類傳遞。在實際應用中,我們可以使用StreamContent類、StringContent類等傳遞更複雜的Http正文。
四、Http客戶端維護
HttpClient默認使用了HTTP keep-alive,這意味着它可以重複使用 TCP 連接來發送多個 HTTP 請求,從而提高性能。重複使用連接意味着網絡和資源成本顯着降低,但也可能增加需要維護連接池和執行請求所需的時間。
如果您需要客戶端在用戶操作中重複使用許多次,請考慮使用單個實例的HttpClient分配,而不是短時間內創建和丟棄實例。
具體實現方式是通過重複使用同一個實例並針對單個應用程序域進行共享來避免重複創建和釋放連接池資源。做法是在創建HttpClient實例之後不要釋放它,並在整個應用程序域中共享該實例。這樣做可以讓程序員更容易控制這些資源以及讓HttpClient在內部處理連接池的配置和維護。
using System.Net.Http.Headers; class Program { static readonly HttpClient client = new HttpClient(); static async Task Main(string[] args) { using var content = new FormUrlEncodedContent(new Dictionary<string, string> { {"key1", "value1"}, {"key2", "value2"} }); using var response = await client.PostAsync("http://example.com/upload", content); using var responseContent = response.Content; var result = await responseContent.ReadAsStringAsync(); Console.WriteLine(result); } }
在上面的示例中,我們聲明了一個靜態的HttpClient實例,並在應用程序域中共享這個實例。
總結
System.Net.Http為我們提供了一組類庫簡化Http請求和響應的操作。在使用HttpClient時,異步是首選方式可以提高程序性能。我們可以設置Http請求頭和消息體。如果需要在應用程序中頻繁使用HttpClient,我們可以將HttpClient實例在應用程序域中共享,從而提高性能
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/158271.html