- - PR -
HttpWebRequestで「クッキーが無効に設定」エラーとなってしまいます。
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-03-12 01:18
以下のC#のソースで、ログイン認証の必要なWEBにアクセスを試みています。
他の同じようなページでは、同一のプログラムで成功するのですが、 このkd.com(仮称)にアクセスしようとすると 「ご使用のブラウザで、当サイトのクッキーが無効に設定されています」 と表示され、エラーとなってしまいます。 クッキーがうまく取得できていないのでしょうか? また、「 window.navigator.cookieEnabled 」をtrueと認識させる ためには何か特別なことをする必要があるのでしょうか? cContainer = new System.Net.CookieContainer(); //文字コードを指定する System.Text.Encoding enc = System.Text.Encoding.GetEncoding("euc-jp"); //POST送信する文字列を作成 string postData = "user="+HttpUtility.UrlEncode(user,enc) ; //バイト型配列に変換 byte[] postDataBytes = System.Text.Encoding.ASCII.GetBytes(postData); //WebRequestの作成 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://kd.com/"); req.Timeout = 2000; //CookieContainerプロパティを設定する req.CookieContainer = new System.Net.CookieContainer(); //要求元のURIに関連したCookieを追加し、要求に使用する req.CookieContainer.Add(cContainer.GetCookies(req.RequestUri)); req.KeepAlive=true; //req.UserAgent = "MSIE 6.0"; req.UserAgent = "Mozilla/4.04"; //メソッドにPOSTを指定 req.Method = "POST"; req.Proxy = System.Net.WebProxy.GetDefaultProxy(); //POSTの場合は通常"application/x-www-form-urlencoded"を使う req.ContentType = "application/x-www-form-urlencoded"; //POST送信するデータの長さを指定 //req.ContentLength = postDataBytes.Length; //データをPOST送信するためのStreamを取得 System.IO.Stream reqStream = req.GetRequestStream(); //ContentTypeを"application/x-www-form-urlencoded"にする //送信するデータを書き込む reqStream.Write(postDataBytes,0 , postDataBytes.Length); reqStream.Close(); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)req.GetResponse(); //受信したCookieのコレクションを取得する System.Net.CookieCollection cookies = req.CookieContainer.GetCookies(req.RequestUri); //取得したCookieを保存しておく cContainer.Add(cookies); //応答データを受信するためのStreamを取得 System.IO.Stream resStream = res.GetResponseStream(); //受信して表示 sr = new System.IO.StreamReader(resStream, enc); ***************************************************************************** 上記のsrで読み込んだ、kd.com(仮称)のレスポンスの一部です。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=euc-jp"> <title>ログイン</title> <meta name="description"content=""> <meta name="keywords"lang="ja"content=""> <meta http-equiv="Content-Script-Type"content="text/javascript"> <meta http-equiv="Content-Style-Type"content="text/css"> <link rel="stylesheet" type="text/css" href="./css/cmn.css"> </head> ・・・・・・・・・中略 <script type="text/javascript"> <!-- if(window.navigator.cookieEnabled != true){ //document.write('<div class="px12" align="center"><font color="red">お使いのブラウザで、クッキーの使用が有効になるように設定してください。</font><br/><br/></div>'); window.alert('お使いのブラウザで、クッキーの使用が無効に設定されています。\nクッキーを有効にしてご利用ください。'); } //--> </script> <span class="px12"><font color="red">・ ご使用のブラウザで、当サイトのクッキーが無効に設定されています。設定をご確認ください。</font></span><br> | ||||||||||||
|
投稿日時: 2005-03-13 00:11
これはwindowsアプリってことでいいんですかね。「要するに何がしたいのか」を
もう少し書くといいと思います・・
あと、kd.com(仮称)にIEなどでアクセスした時には成功するのですかね。
これって元ネタはここですかね。 http://dobon.net/vb/dotnet/internet/usecookie.html
おそらく出来ないと思いますよ。上のページにもあるように「CookieContainer プロパティに適当なCookieContainerオブジェクトを設定しておく必要があります」。 クッキーを一度も受信してないから「受信したCookieのコレクションを取得する」の 部分で、取得できないのかなと。 Webサーバ側の実装にもよるんでなんともいえないと思いますが。 | ||||||||||||
|
投稿日時: 2005-03-15 01:21
返信ありがとうございます。
>その「他の同じようなページ」はクッキー認証(?)を必要とするのですか? この言葉で目が覚めました。 成功しているページはクッキーを使用していませんでした。 クッキーについて色々と勉強してみて、なんとなくわかりました。 しかしC#でレスポンスのクッキーの取得方法がわからず苦戦しています。 HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse(); System.Net.CookieCollection cook = webres.Cookies; などとしてみましたが、cook.Count が 0 で、何も入ってなさそうでしたので、 現在はHttpヘッダーの"Set-Cookie"行を直接、stringに読み込んで レスポンスのクッキーのvalue部分の文字列をHttpCookieにはめ込むという かなりかっこ悪いやり方をしています。 この方法でなんとかログインはうまくいきました。 サーバーからのレスポンスの"Set-Cookie"で指定されたクッキーを C#の変数に代入するにはどのようにしたらよいのでしょうか。 | ||||||||||||
|
投稿日時: 2005-03-15 01:55
MSDNからの引用ですが、
とのことですので、リクエスト時にCookieContainerをセットする必要があります。 //一番初めは空のCookieContainerで問題ないでしょう。 [ メッセージ編集済み 編集者: Hongliang 編集日時 2005-03-15 02:08 ] |
1