gpt4 book ai didi

C# 如何使用共享的 HttpClient 传递 cookie

转载 作者:太空狗 更新时间:2023-10-29 18:14:46 26 4
gpt4 key购买 nike

我有以下设置:

JS 客户端 -> Web API -> Web API

我需要一直向下发送身份验证 cookie。我的问题是将它从一个 web api 发送到另一个。由于与使用 FormsAuthentication 的旧系统集成,我必须传递身份验证 cookie。

出于性能原因,我在以下字典中共享了一个 HttpClients 列表(每个 web api 一个):

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

所以给定一个标识符我可以获取相应的 HttpClient。

以下是有效的,但我很确定这是错误的代码:

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...

这里的错误在于 1) 在请求中操作 DefaultRequestHeaders 似乎是错误的,并且 2) 由于 HttpClient 是共享的,因此两个同时的请求可能会弄乱 cookie。

我已经搜索了一段时间但没有找到解决方案,因为大多数有匹配问题的实例都会为每个请求实例化 HttpClient,因此能够设置所需的 header ,这是我试图避免的。

有一次我收到了使用 HttpResponseMessage 的请求。也许这可以启发解决方案。

所以我的问题是:有没有一种方法可以使用 HttpClient 为单个请求设置 cookie,这对于使用同一实例的其他客户端是安全的?

最佳答案

您可以使用 HttpRequestMessage 和 SendAsync() 而不是调用 PutAsJsonAsync():

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);

更新:为确保您的 HTTP 客户端不存储响应中的任何 cookie,您需要执行以下操作:

var httpClient = new HttpClient(new HttpClientHandler() { UseCookies = false; });

否则,您可能会因使用一个客户端并共享其他 cookie 而出现意外行为。

关于C# 如何使用共享的 HttpClient 传递 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35704788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com