在Flurl.Http v2.0.1中从请求中获取cookie

时间:2017-11-14 17:35:37

标签: c# flurl

使用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

我注意到IFlurlRequestIFlurlRequest属性,因此我将第4行更改为:

Client

现在编译但在运行时因InvalidOperationException而失败:

  

此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性。

我假设这是因为积极重用了底层的HttpClient。我在3到4之间添加了一行来创建一个新的FlurlClient,以确保实例无法启动请求。

4. ((HttpClientHandler)client.Client.HttpMessageHandler).CookieContainer = cookieJar;

现在再次运作,但我不确定我是否正确地这样做。任何反馈都将不胜感激。

1 个答案:

答案 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;
}