HttpWebRequest:将 Cookie 添加到 CookieContainer -> ArgumentException(参数名称:cookie.Domain)

Posted

技术标签:

【中文标题】HttpWebRequest:将 Cookie 添加到 CookieContainer -> ArgumentException(参数名称:cookie.Domain)【英文标题】:HttpWebRequest: Add Cookie to CookieContainer -> ArgumentException (Parametername: cookie.Domain) 【发布时间】:2013-09-11 03:40:56 【问题描述】:

我正在尝试通过我的应用程序登录网站。 我做了什么:

首先我弄清楚了浏览器如何使用 Fiddler 进行授权过程。 我检查了 POST 请求是如何构建的,并尝试重建它。 浏览器发送 4 个 cookie(谷歌分析),我尝试设置它们:

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】:

CookieContainers 可以为不同的网站保存多个 cookie,因此必须提供一个标签(域)来将每个 cookie 绑定到每个网站。可以在实例化单个 cookie 时设置域,如下所示:

Cookie chocolateChip = new Cookie("CookieName", "CookieValue")  Domain = "DomainName" ;

获取域的一种简单方法是创建一个包含目标 URL 的 Uri(如果您还没有使用),并使用 Uri.Host 属性设置 cookie 的域。

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

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

【讨论】:

一个如此简单的类应该是自我记录的,而不必是堆栈溢出问题。至少微软已经朝着正确的方向迈出了一步,并且没有显示通用的“发生错误”。

以上是关于HttpWebRequest:将 Cookie 添加到 CookieContainer -> ArgumentException(参数名称:cookie.Domain)的主要内容,如果未能解决你的问题,请参考以下文章

c# httpwebrequest 模拟登陆

HttpWebRequest 保存Cookies,模拟Session登录

将 cookie 设置为 WebView 控件

HttpWebRequest模拟登陆页面,已登陆成功,但是用WebClient抓取主页面时,总是提示操作超时

HttpWebRequest的GetRespons偶尔超时死掉的原因及解决办法

c# HttpWebRequest https的一些处理