- PR -

HttpWebRequestで「クッキーが無効に設定」エラーとなってしまいます。

1
投稿者投稿内容
hourseX
会議室デビュー日: 2004/12/07
投稿数: 11
投稿日時: 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">・&nbsp;ご使用のブラウザで、当サイトのクッキーが無効に設定されています。設定をご確認ください。</font></span><br>
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-13 00:11
これはwindowsアプリってことでいいんですかね。「要するに何がしたいのか」を
もう少し書くといいと思います・・

引用:
他の同じようなページでは、同一のプログラムで成功するのですが

その「他の同じようなページ」はクッキー認証(?)を必要とするのですか?
あと、kd.com(仮称)にIEなどでアクセスした時には成功するのですかね。

引用:
また、「 window.navigator.cookieEnabled 」をtrueと認識させる
ためには何か特別なことをする必要があるのでしょうか?

javascriptはブラウザが動かすんだからこの時点では「認識」も何もないのでは?

これって元ネタはここですかね。
http://dobon.net/vb/dotnet/internet/usecookie.html
引用:
クッキーがうまく取得できていないのでしょうか?

GetCookies(req.RequestUri)でローカルのクッキーを取得しようとしてるならそれは
おそらく出来ないと思いますよ。上のページにもあるように「CookieContainer
プロパティに適当なCookieContainerオブジェクトを設定しておく必要があります」。
クッキーを一度も受信してないから「受信したCookieのコレクションを取得する」の
部分で、取得できないのかなと。

Webサーバ側の実装にもよるんでなんともいえないと思いますが。
hourseX
会議室デビュー日: 2004/12/07
投稿数: 11
投稿日時: 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#の変数に代入するにはどのようにしたらよいのでしょうか。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-03-15 01:55
MSDNからの引用ですが、

引用:
HttpWebResponse.Cookies プロパティ

Cookies プロパティは、応答に関連付けられている cookie を保持する CookieCollection クラスのインスタンスを提供します。

関連付けられている HttpWebRequest の CookieContainer プロパティが null 参照 (Visual Basic では Nothing) の場合は、 Cookies プロパティも null 参照 (Nothing) になります。ただし、サーバーから送信される cookie 情報は、 Headers プロパティで使用できます。


引用:
HttpWebRequest.CookieContainer プロパティ

CookieContainer プロパティは、要求に関連付けられている Cookie を格納する CookieContainer クラスのインスタンスを提供します。

CookieContainer の既定値は null 参照 (Visual Basic では Nothing) です。GetResponse が返す HttpWebResponse の Cookies プロパティで Cookie を返すには、 CookieContainer インスタンスをそのプロパティに割り当てる必要があります。


とのことですので、リクエスト時にCookieContainerをセットする必要があります。
//一番初めは空のCookieContainerで問題ないでしょう。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-03-15 02:08 ]
1

スキルアップ/キャリアアップ(JOB@IT)