Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何知道必须使用哪些cookie才能发出正确的HttpWebRequest?_C#_Cookies_Httpwebrequest - Fatal编程技术网

C# 我如何知道必须使用哪些cookie才能发出正确的HttpWebRequest?

C# 我如何知道必须使用哪些cookie才能发出正确的HttpWebRequest?,c#,cookies,httpwebrequest,C#,Cookies,Httpwebrequest,我正在使用下载管理器,并尝试使用HttpWebRequest获取cookie所需的内容。我想将我的应用程序集成到Chrome上,这样我就可以从浏览器中获得必要的cookie头和值 但首先,我需要知道获取下载内容是否需要cookie,以及它们是哪些cookie。我找不到任何关于这个话题的有用资源 这就是我的想象: 如何执行这些步骤?这取决于您要执行的实际下载和服务器的要求。不管cookies是什么,大多数服务器都允许下载。 不过,你可以随时发送cookies以防万一。你需要什么饼干?以下是一些浏览

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

但首先,我需要知道获取下载内容是否需要cookie,以及它们是哪些cookie。我找不到任何关于这个话题的有用资源

这就是我的想象:


如何执行这些步骤?

这取决于您要执行的实际下载和服务器的要求。不管cookies是什么,大多数服务器都允许下载。
不过,你可以随时发送cookies以防万一。你需要什么饼干?以下是一些浏览器如何操作的规则: Cookie具有域和路径属性。域应用于子域。 因此,如果请求发送以下cookie:
-那些拥有域com、bar.com和foo.bar.com但没有路径的用户
-与前面相同,但具有类似于/some或some/path等的路径

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


所以,您必须以同样的方式搜索cookie,这取决于您应该下载的文件的URL。

您肯定应该集成cookie,因为网站需要在cookie中识别用户集数据

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

要使用的Cookie依赖于站点,您无法猜测网站是否需要它们,哪些是需要的,哪些不是

如果你使用.NET 4.5 +,考虑使用“WebRestQuest.CreateHttp”静态方法

跟踪CookieContainer,它最终将由响应中的新cookie填充(在响应中设置cookie头)

注意:cookie链接到一个域(即stackoverflow.com)
我建议你在Chrome浏览器上安装一个cookie扩展来玩

我本来会添加一条评论,但是没有足够的代表。你似乎走对了方向。Mateusz Radny建议使用EditThisCookie,这将允许您浏览浏览器中的cookie,但对于任何特定的web服务器,您通常不需要确定哪一个是哪一个(因此您真的不需要关心哪一个是登录cookie)

Cookie的协议是,浏览器应将web服务器最初发送给该特定网站浏览器的Cookie发回。可能有助于阅读更多关于Cookie的内容:(可能跳到实现,然后阅读一些隐私和第三方Cookie,因为您确实不想与其他网站共享来自一个网站的Cookie)

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

*注意:有时cookie被标记为仅用于某些类型的连接,或用于特定的域/子域或Uri路径。如果设置了,那么您应该根据它是否与您尝试建立的连接相匹配来限制发送这些内容的时间。请单独研究(最新的RFC规范:)


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

从服务器获取内容所需的cookie由该服务器在HTTP响应的“set cookie”头中指定。一般情况是:

  • 客户端向服务器发出HTTP请求(这可能是登录页或下载页)
  • 服务器使用包含“Set Cookie”头的HTTP响应进行响应
  • 客户记得所有的饼干
  • 客户端将步骤3中存储的cookie用于对同一服务器的所有后续请求
  • 现在,考虑到您集成到Chrome的场景,我认为初始请求(步骤1到3)将不是由您的应用程序完成的,而是由Chrome本身完成的。cookie将存储在Chrome的cookie store中。因此,您的应用程序需要做的是从Chrome获取您想要下载的域的所有cookie,并将这些cookie包含在您的请求中(步骤4)


    请参阅有关如何使用Chrome API与其cookie存储交互的文档,以及有关如何在HTTP响应中指定cookie的深入描述。

    尝试从第一个请求(可能是登录页面)捕获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();
        }
    

    希望这有帮助。

    看看Chrome的这个扩展:。您可以使用它来查看web请求/响应使用了哪些cookie。谢谢,但我想用c#代码来完成,我只需要所需的cookie标头响应cookie容器是否告诉我们需要哪些cookie?此外,我还为Chrome提供了EditThisCookie扩展,但有登录、安全、仅Http cookie等类型,并且每个类型都有多个cookie。我无法理解哪个是登录cookie。即使在响应中,您也无法确定需要哪些cookie。cookie依赖于站点,也可以依赖于网站使用的技术(asp net、php…),web开发人员也可以使用具有自定义名称的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();
        }