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 问题的主要内容,如果未能解决你的问题,请参考以下文章
Cannot instantiate the type HttpClient问题(转)