web-dev-qa-db-ja.com

HttpWebRequest:CookieContainerにCookieを追加-> ArgumentException(パラメーター名:cookie.Domain)

アプリケーションを使用してWebサイトにログインしようとしています。私がしたこと:

最初に、ブラウザーが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のコンストラクターはドメインを必要とせず、この値をどこで取得できるかわかりませんか?

あなたの誰かがこれで私を助けることができれば、非常に素晴らしいでしょう。
私はウェブ開発者でもウェブの専門家でもないので、あまり知りません。
「短くて迅速な回答」がない場合、これについて学ぶことができる素晴らしい情報源があるでしょうか?

44
TorbenJ

CookieContainersは異なるWebサイトの複数のCookieを保持できるため、各Cookieを各Webサイトにバインドするにはラベル(ドメイン)を提供する必要があります。ドメインは、次のように個々の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 });
78
Ichabod Clay