: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
Ç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
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. –