C#HttpClient Cookie和会话ID问题
浏览了一些阅读材料,发现对于只需要输入到简单表单中的流程,而不是浏览器自动化,我听说要向服务器发出请求并向服务器发送它希望通过HTTPrequests获得的信息。我想我会试一试的 我将在这里直截了当地说:C#HttpClient Cookie和会话ID问题,c#,cookies,httpclient,C#,Cookies,Httpclient,浏览了一些阅读材料,发现对于只需要输入到简单表单中的流程,而不是浏览器自动化,我听说要向服务器发出请求并向服务器发送它希望通过HTTPrequests获得的信息。我想我会试一试的 我将在这里直截了当地说: class Program { private static System.Net.CookieContainer cookieContainer = new CookieContainer(); private static HttpClientHandler cl
class Program
{
private static System.Net.CookieContainer cookieContainer = new CookieContainer();
private static HttpClientHandler clientHandler = new HttpClientHandler
{
AllowAutoRedirect = true,
UseCookies = true,
CookieContainer = cookieContainer
};
这就是我试图让Http客户机在整个程序中使用的原因。当我到达我的第一个登录屏幕时(我使用fiddler查看表单需要发布什么),我成功地登录了帖子
我将向您展示post方法:
async static void PostRequest(string strUrl,
IEnumerable<KeyValuePair<string, string>> queries)
{
HttpContent q = new FormUrlEncodedContent(queries);
HttpResponseMessage response = await client.PostAsync(strUrl, q);
HttpContent content = response.Content;
string myContent = await content.ReadAsStringAsync();
// Console.WriteLine(myContent);
Console.WriteLine(response);
Console.WriteLine(myContent);
response.Dispose();
}
异步静态void PostRequest(字符串strUrl,
IEnumerable查询)
{
HttpContent q=新的FormUrlEncodedContent(查询);
HttpResponseMessage response=wait client.PostAsync(strUrl,q);
HttpContent=response.content;
字符串myContent=wait content.ReadAsStringAsync();
//控制台。写线(myContent);
控制台写入线(响应);
控制台。写线(myContent);
response.Dispose();
}
我的问题是,我尝试做的下一个帖子是你登录后的另一个表单。我再次使用Fiddler计算出服务器期望的内容,并将其发布到适当的URL,但当我打印流程的每个步骤时,它几乎不知道会话或其他内容。Fiddler向我展示了cookie和会话,我认为它是用容器捕获的,然后当我请求/发布到服务器上的页面时,它可以在程序的其余部分使用
我遗漏了什么吗?你们都无法访问实际的网页,但我可以解释fiddler在cookie选项卡下显示的内容:请求发送了2685字节的cookie数据,然后是一组巨大的随机字母和数字以及一些特定于我登录的值,然后我还看到另一组随机数字和字母,称为会话id
总结一下我的问题,我是否误解了CookieContainer的工作?我的假设是,在我向这个HttpClient发出的所有请求或帖子中,它都会从我初次登录时就知道这是一个会话
我可能还没有发现的想法、想法和链接都很感激:)
谢谢大家 您面临的问题是,从浏览器的角度来看,cookie是自动的,但它们必须往返于服务器 因此,当您在浏览器之外时(从.NET的角度来看),CookieContainer将与请求(及其响应)绑定,仅此而已 为了实现您想要的,您需要从响应中检索cookie值,将它们存储在其他地方,然后在下一个请求中重新插入它们
您会发现创建某种类型的
客户端
非常有用,可以封装该客户端,并自动将来自上一个响应的cookie附加到下一个请求,这样您就不必每次都手动执行该操作。CookieContainer与一个请求/响应绑定。您需要从登录响应中检索身份验证cookie,并将其重新添加到其他请求中。IMHO,这里最好的方法是创建一个ServiceCliente
,跟踪并在每次请求时自动添加此cookie,而不是每次都手动添加。明白了,当你这么说的时候,你是指我能够打印到控制台中的值,它以“set cookie”开头,所以后面的值(长字符串)是我想要的?Anderson,你应该回答这个问题,这样我就可以选择它。我能够按照你说的那样获取cookie和会话ID。Aswered,这样你就可以标记为已解决。然后我将删除此评论:)谢谢你!真的帮了我的忙!您能提供一些关于您描述的解决方案的参考吗?@Muflix可能会有所帮助。