2014-05-21 31 views
12

Tôi cần thay đổi thuộc tính HttpClient.Timeout sau khi yêu cầu. Khi tôi thử, tôi nhận được ngoại lệ:Tự động thay đổi HttpClient.Timeout trong .NET

Ví dụ này đã bắt đầu một hoặc nhiều yêu cầu. Chỉ có thể sửa đổi các thuộc tính trước khi gửi yêu cầu đầu tiên.

Có cách nào để tránh điều này không?

+0

Thư có rõ không? –

+0

Đặt trước yêu cầu? – geedubb

+0

@ L.B., Thông báo rõ ràng. Nhưng tôi vẫn tự hỏi là có bất kỳ thủ thuật nào để tránh điều này. geedubb, tôi cần phải thay đổi sau. – AsValeO

Trả lời

8

Bạn không thể làm gì để thay đổi điều này. Đây chỉ là hành vi mặc định trong việc thực hiện HttpClient.

Thuộc tính Thời gian chờ phải được đặt trước phương thức GetRequestStream hoặc GetResponse. From HttpClient.Timeout Remark Section

Để thay đổi thời gian chờ, tốt nhất bạn nên tạo một phiên bản mới của HttpClient.

client = new HttpClient(); 
client.Timeout = 20; //set new timeout 
+2

Hãy coi chừng: việc tạo/xử lý 'HttpClient' có thể gây ra sự cố hết sức của ổ cắm: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Monsignor

3

Bên tài sản Timeout được sử dụng để thiết lập một CancellationTokenSource đó sẽ hủy bỏ các hoạt động async khi thời gian chờ mà là đạt. Kể từ khi một số quá tải của HttpClient phương pháp chấp nhận CancellationTokens, chúng ta có thể tạo ra các phương pháp helper để có một timeout tùy chỉnh cho các hoạt động cụ thể:

public async Task<string> GetStringAsync(string requestUri, TimeSpan timeout) 
{ 
    using (var cts = new CancellationTokenSource(timeout)) 
    { 
     HttpResponseMessage response = await _httpClient.GetAsync(requestUri, cts.Token) 
     response.EnsureSuccessStatusCode(); 

     return await response.Content.ReadAsStringAsync(); 
    } 
} 
+2

Đáng chú ý rằng bất kỳ Timeout nào được đặt trên HttpClient sẽ vẫn được thực thi . Điều này chỉ có thể giảm thời gian cần cho một yêu cầu hết thời gian chờ; nó không thể tăng nó. –

2

Thiếu sự hỗ trợ cho tùy chỉnh timeout yêu cầu cấp luôn luôn là một thiếu sót của HttpClient trong tâm trí của tôi . Nếu bạn không nhớ một sự phụ thuộc thư viện nhỏ, Flurl.Http [từ chối trách nhiệm: Tôi là tác giả] hỗ trợ này trực tiếp:

"http://api.com/endpoint".WithTimeout(30).GetJsonAsync<T>(); 

Đây là một môi trường yêu cầu cấp true; tất cả các cuộc gọi đến cùng một máy chủ sử dụng một phiên bản HttpClient được chia sẻ dưới mui xe và các cuộc gọi đồng thời với thời gian chờ khác nhau sẽ không xung đột. Có một cấu hình mặc định toàn cầu (100 giây ban đầu, giống như HttpClient).

Các vấn đề liên quan