.NET應用如何設置請求服務器超時時間?
本文將對.NET應用如何設置請求服務器超時時間進行詳細講解。通過掌握這一技巧,開發人員可以更好地控制應用與服務器之間的交互時間,提高應用的性能和穩定性。
1、HttpClient.Timeout屬性
HttpClient是.NET框架中與HTTP通訊最為常見的類之一。它提供了許多屬性和方法來發起HTTP請求。其中,Timeout屬性用于設置HTTP請求超時的時間。Timeout屬性是一個TimeSpan類型的變量,它表示等待HTTP響應的最長時間。默認值為100秒,可以根據需要進行設置。
下面是一個示例代碼:
using System;using System.Net.Http; class Program static async Task Main() { var client = new HttpClient(); client.Timeout = TimeSpan.FromSeconds(5); // 設置超時時間為5秒 try { HttpResponseMessage response = await client.GetAsync("http://example.com"); // 根據響應結果進行處理 } catch (TaskCanceledException e) { // 請求超時 } }
2、WebRequest.Timeout屬性
WebRequest是.NET框架中原始的HTTP請求類,它提供了更多的細節控制。類似于HttpClient,它也提供了Timeout屬性用于設置請求超時的時間。Timeout屬性也是一個TimeSpan類型的變量,但它表示等待服務器響應的最長時間。
下面是一個示例代碼:
using System;using System.Net; class Program static void Main() { var request = WebRequest.Create("http://example.com") as HttpWebRequest; request.Timeout = (int)TimeSpan.FromSeconds(5).TotalMilliseconds; // 設置超時時間為5秒 try { var response = request.GetResponse() as HttpWebResponse; // 根據響應結果進行處理 } catch (WebException e) { // 請求超時 } }
3、HttpWebRequest.BeginGetResponse、HttpWebRequest.BeginGetRequestStream方法
除了使用同步的方法發送HTTP請求之外,還可以使用異步的方法。HttpWebRequest類中提供了兩個異步方法:BeginGetResponse和BeginGetRequestStream。這兩個方法都接受一個回調方法作為參數,在HTTP請求完成后調用。但是,這兩個方法并沒有提供設置超時時間的功能。因此,開發人員需要使用Timeout屬性和Cancellation Token來手動控制超時時間。
下面是一個示例代碼:
using System;using System.Net; using System.Threading; using System.Threading.Tasks; class Program static async Task Main() { var request = WebRequest.Create("http://example.com") as HttpWebRequest; request.Timeout = (int)TimeSpan.FromSeconds(5).TotalMilliseconds; // 設置超時時間為5秒 CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(5000); // 設置Cancellation Token try { var responseTask = Task.Factory.FromAsync( request.BeginGetResponse, request.EndGetResponse, null); var response = await responseTask.WaitWithCancellationAsync(cts.Token); // 等待異步請求完成 // 根據響應結果進行處理 } catch (OperationCanceledException e) { // 請求超時或被取消 } } static class TaskExtensions public static async TaskWaitWithCancellationAsync( this Tasktask, CancellationToken cancellationToken) { TaskCompletionSourcetcs = new TaskCompletionSource(); using (cancellationToken.Register(() => tcs.TrySetResult(true))) { if (task != await Task.WhenAny(task, tcs.Task)) { throw new OperationCanceledException(cancellationToken); } } return await task; }
4、HttpClientHandler.SendAsync方法
在HttpClient請求中,可以使用HttpClientHandler類的SendAsync方法,該方法除了提供timeout的設置外,通過其RetryPolicy設置失敗嘗試的策略,想盡辦法達到期望的請求成功率??梢栽谥卦嚂r設置不在發出Http異常,但請求之間的超時可以不同。下面是一個示例代碼:
using System;using System.Net.Http; using Polly; class Program static async Task Main() { var httpClient = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip DecompressionMethods.Deflate, }); //重試的難點在于重試后是否會出現成功的期望狀態 var response=new HttpResponseMessage() await Policy .Handle() .Or() .WaitAndRetryAsync( retryCount: 6, sleepDurationProvider: (retryAttempt, context) => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) + TimeSpan.FromMilliseconds((new Random().Next(0, 1000)) / 2), // exponential backoff with jitter onRetry: (exception, retryCount) => { //這里可以針對不同錯誤進行不同的行為,包括重試的控制,超時的控制等 }) .ExecuteAsync(async () => { var request = new HttpRequestMessage(HttpMethod.Get, "http://example.com"); request.Headers.AcceptEncoding.ParseAdd("gzip,deflate"); //這里開啟重試 response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); //根據狀態碼進行判斷 }); }通過以上4個方面對.NET應用如何設置請求服務器超時時間的詳細闡述,我們可以看出,控制請求超時時間對于應用的穩定性和性能非常重要。開發人員可以根據具體需求選擇合適的方法來實現。
總結:本文介紹了.NET應用中如何設置請求服務器超時時間,包括HttpClient.Timeout屬性、WebRequest.Timeout屬性、HttpWebRequest.BeginGetResponse和HttpWebRequest.BeginGetRequestStream方法、HttpClientHandler.SendAsync方法4個方面。掌握這些技巧可以幫助開發人員更好地控制應用與服務器之間的交互時間,提高應用的性能和穩定性。