gpt4 book ai didi

c# - 使用 Web API 自托管时如何从 HttpClientHandler.CookieContainer 获取 cookie?

转载 作者:行者123 更新时间:2023-11-30 22:06:11 28 4
gpt4 key购买 nike

我正在尝试为返回 cookie 的 Web API 方法编写集成测试。基于这个问题,我认为我需要设置 HttpClientHandler 的 CookieContainer。

HttpClient Not Saving Cookies

然后,基于这个问题,我认为我需要将此 HttpClientHandler 设置为我的 HttpServer 实例的 InnerHandler,以便我可以链接处理程序。

How to perform in-memory test of HttpClientHandler

问题是我仍然发现 CookieContainer 是空的。我有一个 Assert 验证响应中是否有包含我期望的 cookie 的 header 。这是我的代码:

        // Set up in-memory hosting of Web API
var config = new HttpConfiguration();
WebApiConfig.Register(config);

var cookieJar = new CookieContainer();
var httpClientHandler = new HttpClientHandler
{
CookieContainer = cookieJar,
UseCookies = true
};
var httpServer = new HttpServer(config)
{
InnerHandler = httpClientHandler
};

const string loginUrl = "http://localhost/api/authentication/login";
var uri = new Uri(loginUrl);

var client = new HttpClient(httpServer) { BaseAddress = uri };

var response =
client.PostAsJsonAsync(uri,
new LoginMessage {Email = UserEmail, Password = Password},
CancellationToken.None).Result;
response.EnsureSuccessStatusCode();

var data = response.Content.ReadAsAsync<LoginResponse>().Result;
Assert.IsTrue(response.Headers.Contains("Set-Cookie"));
Assert.AreNotEqual(0, httpClientHandler.CookieContainer.Count);

最后一个关于 CookieContainer 中项目数的断言失败了。我还尝试调用 httpClientHandler.CookieContainer.GetCookies(uri),但生成的 cookie 集合仍然包含零个元素。

我也尝试过显式链接我的客户端处理程序,但没有发现行为上的差异。

        var cookieJar = new CookieContainer();
var httpClientHandler = new HttpClientHandler
{
CookieContainer = cookieJar,
UseCookies = true
};
var httpServer = new HttpServer(config);

var client = HttpClientFactory.Create(httpClientHandler, httpServer);

有人可以告诉我我在尝试检索这些 cookie 时做错了什么吗?我在响应 header 中看到的 cookie 如下所示:

Temp=E4C4947BAB708D089C636B4A5BDA094A10C8B1D66347EBD96629CB9BDB589822198A09BCBBE22C13D07AFC4D4C3C91E78C08BECFC9CC03BEE881858A1B4752EDC1BB1E604B819FBAFE34776B6F46B78ADCD2421F8125A395784981BFF22CEBE19DB228158E85B5786279E55D4114B72E50098B2374C23A43B7C89EBA30F771C54E1D98A6B1CD315D1FB8623E8E97E41FE4279479B49D0A948E2752CA09BD17FF7B52764E96EA43DB9E98D7CEBD8A73C9547A696C170CFC9B6F75CA23B881ED9675C2344A2A16BEF2DFD70DBA723FB62578E7779ECADCF11347B22199DAC8FA6A; expires=Thu, 22 May 2014 01:37:36 GMT; path=/

最佳答案

根据我从 Darrel Miller 收到的关于原始问题的评论,似乎处理此问题的唯一方法是我们有一个使用 HttpServer 作为内部处理程序的委托(delegate)处理程序。

我最终构建了自己的 CookieDelegateHandler,如下所示:

    public class CookieDelegateHandler : DelegatingHandler
{
public CookieContainer CookieContainer { get; set; }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return
base.SendAsync(request, cancellationToken).ContinueWith(responseToCompleteTask
=>
{
var result = responseToCompleteTask.Result;
var cookieHeaders = result.Headers.Where(pair => pair.Key == "Set-Cookie");
foreach (var value in cookieHeaders.SelectMany(header => header.Value))
{
CookieContainer.SetCookies(request.RequestUri, value);
}
return result;
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}
}

通过这个实现,我可以像这样实例化 HttpClient:

    var client = new HttpClient(new CookieDelegateHandler
{
CookieContainer = new CookieContainer(),
InnerHandler = new HttpServer(config)
});

执行委托(delegate)处理程序的延续,并将 cookie 添加到 CookieContainer。

我欢迎关于如何在没有这个自定义委托(delegate)处理程序的情况下解决此问题的任何其他想法,或者对我的解决方案中是否存在问题发表评论。

关于c# - 使用 Web API 自托管时如何从 HttpClientHandler.CookieContainer 获取 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23797158/

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