2014-05-21 12 views
12

içinde dinamik olarak değiştirerek bir istekte bulunulduktan sonra HttpClient.Timeout özelliğini değiştirmem gerekiyor. Denediğimde bir istisna alıyorum:HttpClient.Timeout öğesini .NET

Bu örnek zaten bir veya daha fazla istekte bulundu. Özellikler sadece ilk isteği göndermeden önce değiştirilebilir.

Bundan kaçınmanın bir yolu var mı?

+0

Mesaj açık değil mi? –

+0

İstekten önce ayarlayın ?? – geedubb

+0

@ L.B., Mesaj açık. Ama hala merak ediyorum ki bundan kaçınmak için bir numara var. geedubb, sonra değiştirmem gerek. – AsValeO

cevap

8

Bunu değiştirmek için yapabileceğiniz fazla bir şey yok. Bu, yalnızca HttpClient uygulamasında varsayılan davranıştır.

Zaman aşımı özelliği, GetRequestStream veya GetResponse yöntemi çağrılmadan önce ayarlanmalıdır. aşımını değiştirmek için

From HttpClient.Timeout Remark Section, bir yeni bir örneğini HttpClient oluşturmak için en iyi olurdu.

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

Dikkat: 'HttpClient' oluşturma/imha etme soket tükenmesi sorunlarına neden olabilir: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Monsignor

3

Dahili olarak Timeout özelliği bu zaman aşımı ulaşıldığında zaman uyumsuz işlemi iptal edecek bir CancellationTokenSource kurmak için kullanılır. HttpClient yöntemlerden bazıları aşırı yükler CancellationTokens kabul yana, belirli işlemler için özel bir zaman aşımı var yardımcı yöntemleri oluşturabilirsiniz: özel istek düzeyindeki zaman aşımına uğrayan destek

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

HttpClient üzerinde ayarlanmış herhangi bir Zamanaşımı'nın hala uygulanmaya devam edeceğini dikkate alarak . Bu, yalnızca zaman aşımına uğramak için gereken süreyi azaltabilir; onu artıramaz. –

2

eksikliği hep aklımda HttpClient bir eksiklik olmuştur . Eğer küçük bir kütüphane bağımlılık sakıncası yoksa, Flurl.Http [uyarı: Ben yazarım] Bu doğrudan destekler:

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

Bu gerçek istek düzeyinde bir ayardır; Aynı anasisteme yapılan tüm çağrılar, başlık altında paylaşılan bir HttpClient örneğini kullanır ve farklı zaman aşımları ile eşzamanlı çağrılar çakışmaz. Yapılandırılabilir bir genel varsayılan var (başlangıçta 100 saniye, HttpClient ile aynı).