Httpclient Cookie 问题

Posted

技术标签:

【中文标题】Httpclient Cookie 问题【英文标题】:Httpclient Cookie Issue 【发布时间】:2017-01-11 19:42:11 【问题描述】:

问题:我正在尝试使用 httpclient 从站点获取数据。现在该站点要求您首先访问一个链接,然后只有您可以将数据发布到下一个链接。 Link1 是一个简单的 get 请求 Link2 是一个发布请求 现在我认为该站点首先从链接 1 存储一些 cookie,然后只允许您将数据发布到链接 2,因为每当我尝试以隐身方式打开链接 2 时,站点都会显示错误消息“会话超时或达到最大连接数限制. 无法继续。请关闭并重新启动您的浏览器 " 现在我已经尝试过了:

 try
        
            //Send the GET request
            httpResponse = await httpClient.GetAsync(new Uri(link1UriString));
            //Send the POSTrequest
             httpResponse = await httpClient.PostAsync(new Uri(link2uriString),postContent);                
            httpResponseBody = await httpResponse.Content.ReadAsStringAsync();

            

但我收到会话超时错误消息。如何在 httpClient 中维护会话的 cookie 持续从 web 接收。就像在 python 中一样,它可以通过

 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
 urllib2.install_opener(opener)

Link1Link2

【问题讨论】:

这是 VIT Wi-Fi :P。你也完成了这个?我正在尝试做同样的事情并需要帮助:( 【参考方案1】:

您可以使用 CookieContainer 为您处理 cookie。 这样做,您将像这样创建 HttpClient。

using System.Net;
using System.Net.Http;

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
HttpClient httpClient = new HttpClient(handler);

httpResponse = await httpClient.GetAsync(new Uri(link1UriString));

(注意使用System.Net.Http中的HttpClient版本)

【讨论】:

太好了,我忘了CookieContainer :),你的回答更优雅 嘿@Matt Kacey 感谢您的回答。现在我需要发布的数据包含一个整数和一个字符串,但 FormurlEncodedContent 只接受字符串值,知道如何使用 httpClinet.PostAsync() 发布这些数据或通过任何其他方法 @Uwpbeginner 这个答案对你不起作用***.com/a/41620514/1755 谢谢,但我想使用 Web.http。【参考方案2】:

所以,在第一次响应后,您有 Set-Cookie 标头:

var responseMessage = await httpClient.GetAsync("http://115.248.50.60/registration/Main.jsp?wispId=1&nasId=00:15:17:c8:09:b1");
IEnumerable<string> values;
var coockieHeader = string.Empty;
if (responseMessage.Headers.TryGetValues("set-cookie", out values))

    coockieHeader = string.Join(string.Empty, values);

之后,只需将您的 cookie 设置为请求消息:

        var httpRequestMessage = new HttpRequestMessage
        
            RequestUri = new Uri("http://115.248.50.60/registration/chooseAuth.do"),
            Content = postContent,
            Method = HttpMethod.Post
        ;

        httpRequestMessage.Headers.Add("Cookie", values);
        var httpResponse = await httpClient.SendAsync(httpRequestMessage);

【讨论】:

嘿@Andrii Krupka 感谢您的回答,但马特的方法更易于实施。

以上是关于Httpclient Cookie 问题的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient.PostAsync 用于上传文件

Cannot instantiate the type HttpClient问题(转)

Java通过代码发给手机发信息

erlang常用模块

Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)

如何从 HttpClient 获取 cookie?