2016-02-29 14 views
5
kurduğum aşağıdaki adres

:C# nasıl kullanarak bir çerez geçmek için paylaşılan HttpClient

JS istemci -> Web Api -> aşağı auth Cookie'ye tüm yol göndermek gerekir Web Api

. Sorunum onu ​​bir web api'den diğerine gönderiyor. FormsAuthentication kullanan eski bir sistemle entegrasyon nedeniyle, auth çerezini geçmek zorundayım.

performans nedenleriyle aşağıdaki sözlükte HttpClients bir listesini (her web API için bir tane) paylaşmaktadır:

private static ConcurrentDictionary<ApiIdentifier, HttpClient> _clients = new ConcurrentDictionary<ApiIdentifier, HttpClient>(); 

yüzden HttpClient gelen yakalayabilir bir tanımlayıcı verilmiş.

aşağıdaki çalışır, ancak bu kötü kod eminim:

HttpClient client = _clients[identifier]; 
var callerRequest = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage; 
string authCookieValue = GetAuthCookieValue(callerRequest); 

if (authCookieValue != null) 
{ 
    client.DefaultRequestHeaders.Remove("Cookie"); 
    client.DefaultRequestHeaders.Add("Cookie", ".ASPXAUTH=" + authCookieValue); 
} 

HttpResponseMessage response = await client.PutAsJsonAsync(methodName, dataToSend); 

// Handle response... 

nedir bu konuda yanlış 1) bir istekte DefaultRequestHeaders işlemek için yanlış geliyor ve 2) potansiyel olarak iki aynı anda yapılabilecek istekleri olduğunu HttpClient paylaşıldığı için çerezleri dağıtabilir.

Bir çözüm bulmadan bir süredir aradığım için, çoğu eşleşen bir soruna sahip olmak her istek için HttpClient öğesini başlatır, dolayısıyla kaçınmaya çalıştığım gerekli üstbilgileri ayarlayabilmek için.

Bir noktada, HttpResponseMessage kullanarak istekleri aldım. Belki de bu bir çözüm için ilham kaynağı olabilir.

Bu yüzden sorum şu: Bir HttpClient kullanarak tek bir istek için çerezleri ayarlamanın bir yolu var mı, bu aynı örneği kullanan diğer istemcilerden güvenli olacak mı? Bunun yerine PutAsJsonAsync() kullanabilirsiniz HttpRequestMessage ve SendAsync() çağıran

cevap

11

:

Uri requestUri = ...; 
HttpMethod method = HttpMethod.Get /*Put, Post, Delete, etc.*/; 
var request = new HttpRequestMessage(method, requestUri); 
request.Headers.TryAddWithoutValidation("Cookie", ".ASPXAUTH=" + authCookieValue); 
request.Content = new StringContent(jsonDataToSend, Encoding.UTF8, "application/json"); 
var response = await client.SendAsync(request); 

GÜNCELLEME: HTTP istemcisi bunu yapmak gereken bir yanıttan herhangi çerezleri saklamaz emin olmak için: Aksi takdirde, bir istemci kullanarak ve diğer çerezleri paylaşarak beklenmedik davranışlar elde edebilirsiniz.

+0

Çok teşekkür ederim! Görünüşe göre gerçekten çok yakındım, ama bitirme çizgisini tamamladın. Bir soru: GET isteğinin stringcontent'i de kullanması mümkün mü? Eğer 'jsonDataToSend' benim karmaşık bir nesne ise, onu geçmez, ama eğer onu bir sorgulamaya çevirirsem ve onu 'yöntem' olarak işlerse. Genel bir yönteme sahip olmak güzel olurdu :) – Casper

+0

np :) Genellikle GET vücut içermez, ancak bu özellik tarafından yasaklanmamıştır. 'StringContent' yerine yeni ObjectContent (değer, yeni JsonMediaTypeFormatter()," application/json ")' nı kullanabilirsiniz. –

İlgili konular