我怎么知道哪个cookie必须做出正确的HttpWebRequest?

时间:2017-02-08 15:14:26

标签: c# cookies httpwebrequest

我正在使用下载管理器并尝试使用HttpWebRequest获取所需的Cookie内容。我想将我的应用程序集成到Chrome,因此我可以从浏览器中获取必要的Cookie标头和值。

但首先我需要知道是否需要cookie来获取内容以及哪些cookie。我无法找到有关此主题的任何有用资源。

  

这就是我的想象:

HttpWebRequest req = (WebRequest.Create(url)) as HttpWebRequest;
//At first, get if cookies are necessary?
//If it is, get the required cookie headers 
//Then add the cookies to the request
CookieContainer cc = new CookieContainer();
Cookie c1 = new Cookie("header1", "value1");
Cookie c2 = new Cookie("header2", "value2");
CookieCollection ccollection = new CookieCollection();
ccollection.Add(c1);
ccollection.Add(c2);
cc.Add(uri, ccollection);
req.CookieContainer = cc;
//Get response and other stuff......

我该如何做这些步骤?

5 个答案:

答案 0 :(得分:4)

从服务器获取内容所需的cookie由该服务器在HTTP响应的“Set-Cookie”标头中指定。通用方案是:

  1. 客户端向服务器发出HTTP请求(可以是登录页面或下载页面)
  2. 服务器响应包含“Set-Cookie”标题的HTTP响应
  3. 客户记得所有这些Cookie
  4. 客户端使用步骤3中存储的cookie来处理对同一服务器的所有后续请求
  5. 现在,考虑到您整合到Chrome中的情况,我认为初始请求(步骤1到3)不会由您的应用程序完成,而是由Chrome本身完成。 Cookie将存储在Chrome的Cookie存储区中。因此,您的应用程序需要做的是从Chrome获取您要下载的域的所有Cookie,并在请求中包含这些Cookie(步骤4)。

    有关如何使用Chrome API与其Cookie存储库进行交互的详情,请参阅chrome.cookies文档;有关如何在HTTP响应中指定Cookie的详细说明,请参阅Set-Cookie docs from Mozilla

答案 1 :(得分:1)

这取决于您要执行的实际下载和服务器的要求。无论cookie如何,大多数服务器都允许下载 但是,您可以随时发送cookie以防万一。你需要什么饼干?以下是浏览器如何执行操作的一些规则: Cookie具有Domain和Path属性。域适用于子域。 因此,如果对http://foo.bar.com/some/path提出请求,将发送以下Cookie:
- 与域com,bar.com和foo.bar.com无路径
- 和以前一样但是有/ some或some / path等路径。

它不会从其他域发送Cookie,也不会从上面列出的域发送Cookie,但路径中不包含路径请求。

因此,您必须以相同的方式搜索Cookie,具体取决于您应下载的文件的网址。

答案 2 :(得分:1)

你肯定应该整合cookie,因为需要将用户设置数据识别为cookie的网站

没有该令牌,您无法执行下载

要使用的Cookie取决于网站,您无法猜测网站是否需要它们,这些是否需要

如果您使用的是.Net 4.5+,请考虑使用" WebRequest.CreateHttp"静态方法 https://msdn.microsoft.com/fr-fr/library/ff382788(v=vs.110).aspx

跟踪CookieContainer,最终将使用响应中的新cookie(响应中的Set-Cookie标头)填充

注意:cookie链接到域(即stackoverflow.com) 我建议您在Chrome浏览器中安装Cookie扩展程序以使用

答案 3 :(得分:1)

我会添加评论,但没有足够的代表。你似乎走在了正确的轨道上。 Mateusz Radny使用EditThisCookie的建议将允许您浏览浏览器中的cookie,但对于任何特定的Web服务器,您通常不需要确定哪个cookie是哪个(所以您真的不需要关心哪个是哪个登录cookie)。

Cookie的协议是浏览器应该将Web服务器最初发送的cookie发回给该特定网站的浏览器。可能有助于阅读更多关于cookie的信息:https://en.wikipedia.org/wiki/HTTP_cookie(可能跳转到实施,然后在隐私和第三方cookie中读取一些因为你真的不想从一个网站与其他网站共享cookie)。

因此,假设您要模拟浏览器将发送的内容,请确保您的下载管理器还发送Chrome从该特定网站收到的同一组Cookie,它应该可以正常运行。还要避免在代码中缓存cookie,因为您的浏览器会更新cookie(例如删除过期的cookie),因此您应该在每次需要时始终从浏览器中获取它们。

*注意:有时,cookie仅针对某些类型的连接进行标记,或者与特定域/子域或Uri路径一起使用。如果设置,那么您应该根据它与您尝试进行的连接是否匹配来限制何时发回。请单独研究(最新的RFC规范:https://tools.ietf.org/html/rfc6265)。

PS:作为您通过下载管理器发出的下载请求的一部分,Web服务器可能会发回新的或更新的cookie。如果你真的想要完美,那么这些应该从你的下载管理器复制回Chrome的cookie集(虽然我不熟悉Chrome API所以不确定会有多难)。

答案 4 :(得分:1)

尝试从第一个请求(可能是登录页面)捕获cookie,并在下一个请求(下载请求)中添加所有这些cookie。像下面的东西。

public void MakeRequest()
    {
        var container = new CookieContainer();

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com/loginpage");
        request.Method = WebRequestMethods.Http.Get;
        request.CookieContainer = container;

        HttpWebResponse response = null;

        response = (HttpWebResponse)request.GetResponse();
        //once you read response u need to add all cookie sent in header to the 'container' so that it can be forwarded on second response
        foreach (Cookie cookie in response.Cookies)
        {
            container.Add(cookie);
        }

        HttpWebRequest downRequest = (HttpWebRequest)WebRequest.Create("http://example.com/downloadpage");
        downRequest.Method = WebRequestMethods.Http.Get;
        downRequest.Proxy = null;

        //As you have added the cookies, this must response fine now
        downRequest.CookieContainer = container;
        response = (HttpWebResponse)downRequest.GetResponse();
        var stream = response.GetResponseStream();
    }

希望这有帮助。