我正在使用下载管理器并尝试使用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......
我该如何做这些步骤?
答案 0 :(得分:4)
从服务器获取内容所需的cookie由该服务器在HTTP响应的“Set-Cookie”标头中指定。通用方案是:
现在,考虑到您整合到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();
}
希望这有帮助。