使用 Flurl.Http v1.2 时,我们有以下代码:
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];
根据发行说明,升级到 v2.0.1 后,第 4 行不再编译,因为client
它不再是 an ,IFlurlClient
它现在是 an 。IFlurlRequest
我注意到它IFlurlRequest
有一个Client
属性,所以我将第 4 行更改为:
4. ((HttpClientHandler)client.Client.HttpMessageHandler).CookieContainer = cookieJar;
现在编译但在运行时失败并出现 InvalidOperationException:
此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性。
我假设这是因为底层 HttpClient 的积极重用。我在 3 和 4 之间添加了一行,以每次创建一个新的 FlurlClient 以确保实例无法启动请求。
1. var cookieJar = new CookieContainer();
2. var url = baseUrl.AppendPathSegment("api/auth/login");
3. var request = url.EnableCookies();
3.5 request.Client = new FlurlClient();
4. ((HttpClientHandler)request.Client.HttpMessageHandler).CookieContainer = cookieJar;
5. var result = client.PostJsonAsync(new { UserName = userName, Password = password }).Result;
6. var cookies = cookieJar.GetCookies(new Uri(baseUrl));
7. _cookie = cookies[0];
这现在再次起作用,但我不确定我是否以正确的方式这样做。对于任何反馈,我们都表示感谢。