使用Flurl.Http v1.2时,我们有以下代码:
10 10 ab bc
11 11 cd ef
a
12 12 gh hi
升级到v2.0.1后,第4行不再编译,因为根据发行说明,1. var cookieJar = new CookieContainer();
2. var url = baseUrl.AppendPathSegment("api/auth/login");
3. var client = url.EnableCookies();
4. ((HttpClientHandler)client.HttpMessageHandler).CookieContainer = cookieJar;
5. var result = await client.PostJsonAsync(new { UserName = userName, Password = password });
6. var cookies = cookieJar.GetCookies(new Uri(baseUrl));
7. _cookie = cookies[0];
不再是client
,现在它是IFlurlClient
。
我注意到IFlurlRequest
有IFlurlRequest
属性,因此我将第4行更改为:
Client
现在编译但在运行时因InvalidOperationException而失败:
此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性。
我假设这是因为积极重用了底层的HttpClient。我在3到4之间添加了一行来创建一个新的FlurlClient,以确保实例无法启动请求。
4. ((HttpClientHandler)client.Client.HttpMessageHandler).CookieContainer = cookieJar;
现在再次运作,但我不确定我是否正确地这样做。任何反馈都将不胜感激。
答案 0 :(得分:5)
您不需要明确管理CookieContainer
; Flurl使得使用cookie变得更加简单。
通常,您希望尽可能多地重用HttpClient
个实例,默认情况下,当您未明确创建FlurlClient
时,2.0会默认为您执行此操作,但是如果将Cookie保留为Cookie多次调用你可能想要自己管理FlurlClient
,否则多个线程可能会在同一个集合上读/写cookie。
还很容易。我认为你的整个例子可以简化为:
using (var cli = new FlurlClient(baseUrl).EnableCookies()) {
await cli.Request("api/auth/login").PostJsonAsync(new {
UserName = userName,
Password = password });
_cookie = cli.Cookies.First().Value;
}