c#进阶(6)—— 网络通信基础知识
1、HttpClient 類
(1)、HttpClient 類 用于發(fā)送HTTP 請求,接收請求的響應(yīng)。
(2)、HttpClient 類 派生于 HttpMessageInvoker類,此基類負責(zé)執(zhí)行 SendAsync(),SendAsync() 方法調(diào)用是異步的,可以編寫一個完全異步的系統(tǒng)來調(diào)用Web服務(wù)。
2、實例
(1)、發(fā)出異步的Get 請求。
namespace InternetCommunicate {class Program{private const string baiduUrl = "http://www.baidu.com.cn";private const string googleUrl = "http://www.google.com";static void Main(string[] args){}/// <summary>/// 異步調(diào)用Get方法/// </summary>/// <returns></returns>public async Task GetDataSimpleAsync(){//實例化一個httpClient 對象,該對象是線程安全的,//client 對象可以處理多個請求,HttpClient 每個實例都維護自己的線程池,//HttpClient 實例之間的請求被隔離,調(diào)用Dispose方法釋放資源。using (var client = new HttpClient()){//調(diào)用 GetAsync(),給他傳遞要調(diào)用的方法地址,把HTTP GET 請求發(fā)送給服務(wù)器,//GetAsync() 返回一個 HttpResponseMessage對象,包含//(1)、標(biāo)題//(2)、狀態(tài)//(3)、內(nèi)容HttpResponseMessage response = await client.GetAsync(baiduUrl);//如果請求成功if(response.IsSuccessStatusCode){Console.WriteLine($"Response Status Code:{(int)response.StatusCode}" +$"{response.ReasonPhrase}");//通過ReadAsStringAsync方法,把返回的內(nèi)容檢索為一個字符串。string responseBodyAsText = await response.Content.ReadAsStringAsync();Console.WriteLine($"Received payLoad of {responseBodyAsText.Length} characters");Console.WriteLine(responseBodyAsText);Console.ReadLine();}}}} }?(3)、傳遞httpheader(標(biāo)題)
發(fā)出請求時,沒有設(shè)置或改變?nèi)魏螛?biāo)題,但HttpClient 的DefaultRequestHeaders 屬性允許設(shè)置或改變標(biāo)題,使用Add 方法可以給集合添加標(biāo)題,設(shè)置標(biāo)題和標(biāo)題值后,會與HttpClient 實例發(fā)送的每個請求一起發(fā)送。
在本示例中,添加以json作為格式的標(biāo)題值。代碼如下:
/// <summary>/// 展示http 標(biāo)題/// </summary>/// <param name="title"></param>/// <param name="httpHeaders"></param>public static void ShowHeaders(string title,HttpHeaders httpHeaders){foreach (var header in httpHeaders){string value = string.Join(" ", header.Value);Console.WriteLine($"Header:{header.Key} Value:{value}");}}/// <summary>/// 設(shè)置httpHeader 傳遞標(biāo)題的信息/// </summary>/// <returns></returns>public async Task GetDataWithHeadersAsync(){try{using(var client = new HttpClient()){//添加作為json數(shù)據(jù)格式的標(biāo)題值client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");//DefaultRequestHeaders 獲取與每個請求一起發(fā)送的值ShowHeaders("Request Headers:", client.DefaultRequestHeaders);//獲取http 響應(yīng)頭的值HttpResponseMessage response = await client.GetAsync(googleUrl);ShowHeaders("Response Headers:", response.Headers);}}catch (Exception ex){throw ex;}}(4)、用HttpMessageHandler自定義請求
創(chuàng)建一個派生于HttpClientHandler的類,重寫SendAsync()方法,該方法需要返回一個Task,對于錯誤的情況,不需要調(diào)用異步方法,只用Task.FromResult返回即可。
public class SampleMessageHandler:HttpClientHandler{private string _message;public SampleMessageHandler(string message){_message = message;}protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){if(_message == "error"){var response = new HttpResponseMessage(HttpStatusCode.BadRequest);return Task.FromResult<HttpResponseMessage>(response); }return base.SendAsync(request, cancellationToken);}}/// <summary>/// 用HttpMessageHandler自定義請求/// </summary>/// <returns></returns>public static async Task GetDataWithMessageHandlerAsync(){//如果消息是error,把響應(yīng)的狀態(tài)碼設(shè)置為bad requestvar client = new HttpClient(new SampleMessageHandler("error"));HttpResponseMessage responseMessage = await client.GetAsync(googleUrl);//etc}(5)、使用SendAsync 創(chuàng)建HttpRequestMessage
使用SendAsync,可以對定義請求有更多的控制,重載HttpRequestMessage類的構(gòu)造函數(shù),傳遞HttpMethod的一個值,GetAsync方法用Get方式創(chuàng)建一個HTTP請求。
使用HttpMethod 不僅可以發(fā)送GET、POST、PUT和DELETE 請求,還可以發(fā)送HEAD、OPTIONS和Trace。
具體代碼如下:
/// <summary>/// 使用SendAsync 創(chuàng)建HttpRequestMessage/// </summary>/// <returns></returns>private async Task GetDataAdvanceAsync(){using(var client = new HttpClient()){var request = new HttpRequestMessage(HttpMethod.Get, googleUrl);HttpResponseMessage response = await client.SendAsync(request);}}總結(jié)
以上是生活随笔為你收集整理的c#进阶(6)—— 网络通信基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABP入门系列(14)——应用Boots
- 下一篇: C#多线程之旅(1)——介绍和基本概念