HttpWebRequest:向CookieContainer添加Cookie-> ArgumentException(Parametername:cookie.Domain)

53

我正在尝试通过我的应用程序登录到一个网站。 我的做法是:

首先,我通过Fiddler了解了浏览器如何进行授权过程。 我检查了POST请求的构建方式,并试图重建它。 浏览器发送了4个cookie(Google Analytics),我试着设置它们:

CookieContainer gaCookies = new CookieContainer();
gaCookies.Add(new Cookie("__utma", "#########.###########.##########.##########.##########.#"));
gaCookies.Add(new Cookie("__utmb", "#########.#.##.##########"));
gaCookies.Add(new Cookie("__utmc", "#########"));
gaCookies.Add(new Cookie("__utmz", "#########.##########.#.#.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"));

我只是将原始的cookie数据替换为#。

然后,我使用调试器逐步执行代码,在第一个gaCookies.Add被执行时,应用程序停止并出现错误。

System.ArgumentException: The parameter '{0}' cannot be an empty string. Parameter name: cookie.Domain

我想知道为什么会发生这种情况。Cookie的构造函数不需要指定域名,我不知道从哪里获取这个值?

如果你们中的任何人可以帮助我,那就太好了。
我不是网站开发人员或网络专家,所以对此并不了解。
如果没有“简短快速的答案”,是否有一个很好的资源可以让我学习相关知识呢?

1个回答

96

CookieContainer可以保存不同网站的多个cookie,因此需要提供一个标签(域名)将每个cookie绑定到每个网站上。在实例化每个cookie时可以设置域名,如下所示:

Cookie chocolateChip = new Cookie("CookieName", "CookieValue") { Domain = "DomainName" };
用一种简单的方法来获取域名,可以创建一个包含目标URL的Uri(如果您还没有使用它),并使用Uri.Host属性设置cookie的域。

一个简单方法是创建一个包含目标网址的Uri(如果您尚未这样做),然后使用Uri.Host属性设置cookie的域名。

CookieContainer gaCookies = new CookieContainer();
Uri target = new Uri("http://www.google.com/");

gaCookies.Add(new Cookie("__utmc", "#########") { Domain = target.Host });

8
这个类应该是自描述的,不需要成为一个stackoverflow的问题。至少微软朝着正确的方向迈出了一步,并没有显示通用的“发生了错误”。 - Brain2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接