1. 程式人生 > >c#進階(6)—— 網絡通信基礎知識

c#進階(6)—— 網絡通信基礎知識

pro erb sin ase nic param row mmu res

1、HttpClient 類 (1)、HttpClient 類 用於發送HTTP 請求,接收請求的響應。 (2)、HttpClient 類 派生於 HttpMessageInvoker類,此基類負責執行 SendAsync(),SendAsync() 方法調用是異步的,可以編寫一個完全異步的系統來調用Web服務。 2、實例 (1)、發出異步的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> /// 異步調用Get方法 /// </summary> /// <returns></returns> public async Task GetDataSimpleAsync() {
//實例化一個httpClient 對象,該對象是線程安全的, //client 對象可以處理多個請求,HttpClient 每個實例都維護自己的線程池, //HttpClient 實例之間的請求被隔離,調用Dispose方法釋放資源。 using (var client = new HttpClient()) { //調用 GetAsync(),給他傳遞要調用的方法地址,把HTTP GET 請求發送給服務器, //GetAsync() 返回一個 HttpResponseMessage對象,包含
//(1)、標題 //(2)、狀態 //(3)、內容 HttpResponseMessage response = await client.GetAsync(baiduUrl); //如果請求成功 if(response.IsSuccessStatusCode) { Console.WriteLine($"Response Status Code:{(int)response.StatusCode}" + $"{response.ReasonPhrase}"); //通過ReadAsStringAsync方法,把返回的內容檢索為一個字符串。 string responseBodyAsText = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Received payLoad of {responseBodyAsText.Length} characters"); Console.WriteLine(responseBodyAsText); Console.ReadLine(); } } } } }

(3)、傳遞httpheader(標題)

發出請求時,沒有設置或改變任何標題,但HttpClient 的DefaultRequestHeaders 屬性允許設置或改變標題,使用Add 方法可以給集合添加標題,設置標題和標題值後,會與HttpClient 實例發送的每個請求一起發送。 在本示例中,添加以json作為格式的標題值。代碼如下:
    /// <summary>
        /// 展示http 標題
        /// </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>
        /// 設置httpHeader 傳遞標題的信息
        /// </summary>
        /// <returns></returns>
        public async Task GetDataWithHeadersAsync()
        {
            try
            {
                using(var client = new HttpClient())
                {
                    //添加作為json數據格式的標題值
                    client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
                    //DefaultRequestHeaders 獲取與每個請求一起發送的值
                    ShowHeaders("Request Headers:", client.DefaultRequestHeaders);
                    //獲取http 響應頭的值
                    HttpResponseMessage response = await client.GetAsync(googleUrl);
                    ShowHeaders("Response Headers:", response.Headers);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
(4)、用HttpMessageHandler自定義請求 創建一個派生於HttpClientHandler的類,重寫SendAsync()方法,該方法需要返回一個Task,對於錯誤的情況,不需要調用異步方法,只用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,把響應的狀態碼設置為bad request
            var client = new HttpClient(new SampleMessageHandler("error"));
            HttpResponseMessage responseMessage = await client.GetAsync(googleUrl);
            //etc
        }
(5)、使用SendAsync 創建HttpRequestMessage 使用SendAsync,可以對定義請求有更多的控制,重載HttpRequestMessage類的構造函數,傳遞HttpMethod的一個值,GetAsync方法用Get方式創建一個HTTP請求。 使用HttpMethod 不僅可以發送GET、POST、PUT和DELETE 請求,還可以發送HEAD、OPTIONS和Trace。 具體代碼如下:
        /// <summary>
        /// 使用SendAsync 創建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);
            }
        }

c#進階(6)—— 網絡通信基礎知識