C#HttpClient Cookie和会话ID问题

时间:2018-10-05 16:11:26

标签: c# cookies httpclient

通过一些阅读材料,发现只需要以简单形式输入的过程,而不是浏览器自动化的过程,我听说了使用HTTPrequests发出的请求和期望信息的请求并发布到服务器。我想我会试一试!

我将尽力指出这一点:

class Program
 {     
   private static System.Net.CookieContainer cookieContainer = new CookieContainer();
    private static HttpClientHandler clientHandler = new HttpClientHandler
    {
        AllowAutoRedirect = true,
        UseCookies = true,
        CookieContainer = cookieContainer
    };

这就是我试图让Http客户端在整个程序中使用的原因。然后,当我进入第一个登录屏幕时(我用提琴手来查看需要发布的表单),我用该帖子成功登录了。

我将向您展示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();

    }

这里的问题是,您尝试登录的下一个帖子是登录后的另一种形式。我再次使用Fiddler来确定服务器的期望值,并将其发布到适当的URL,但是当我打印每个URL时该过程的步骤,几乎就像它不知道会话或其他内容一样。 Fiddler向我展示了cookie和会话,我以为它是用容器捕获的,因此当我请求/发布到服务器上的页面时,它可以在程序的其余部分中使用。

我错过了什么吗?你们都将无法进入实际的网页,但是我可以解释一下cookie标签下的提琴手正在显示什么:说请求发送了2685字节的cookie数据,然后是大量的随机字母和数字以及一些看起来是特定于我的登录名的,然后我还看到了另一组随机的数字和字母,称为会话ID。

所以总结一下我的问题是,我是否误解了CookieContainer的功能?我的假设是我使用HttpClient发出的所有请求或帖子中都知道这是我最初登录时的会话。

我可能尚未发现的思想,想法,链接都得到了感激:)。

谢谢大家!

1 个答案:

答案 0 :(得分:1)

您面临的问题是,从浏览器的角度来看,cookie是自动的,但它们绑定到服务器的往返行程。

因此,当您在浏览器外部(从.NET角度来看)时,CookieContainer将与请求(及其响应)绑定在一起,仅此而已。

要获得所需的内容,您需要从响应中检索Cookie值,将其存储在其他位置,然后在下一个请求中重新插入它们。

您会发现创建某种Client来封装它并自动将先前响应中的cookie附加到下一个请求很有用,因此您不必每次都手动进行操作。