- PR -

IISで実行時にASP.NETでクッキーの値がnullになる

1
投稿者投稿内容
mkonishi1981
会議室デビュー日: 2008/01/28
投稿数: 2
投稿日時: 2008-01-28 15:06
現在ASP.NETで開発を行っていて、下記の現象が発生しています。
A.aspx.csでクッキーに値をセットし、
B.aspx.csでその値を取得しようとすると、
内容がnullになっており、例外が発生してしまいます。

A.aspx.cs
Response.Cookies["USER_ID"].Value = "0000";
Response.Cookies["USER_NM"].Value = "テストユーザ";

B.aspx.cs
lblUser.Text = Request.Cookies["USER_NM"].Value;

上のコードの処理があり、
Response.Redirect("B.aspx");
で遷移してから、クッキーを参照しています。

VisualStudio2005上で、実行させているときは
特に問題なく動いていたのですが、
IIS上にファイルを置いて実行すると、クッキーの値が取れなくなりました。

何台かのサーバをセットアップして試したのですが、
サーバによって、クッキーの取得で例外が起きるタイミングが違います。
しばらくは値が取得できて動作する場合もあれば、
画面遷移を一度した時点で例外が発生する場合もあります。

ブラウザのクッキーを受け入れる設定は行っています。

テスト環境ですが、サーバが
Windows 2003 Server SP2
IIS6.0

クライアントが
Windows XP SP2
IE6 または IE7
です。

このような現象が起きる原因や、対策法など
心当たりがありましたら教えていただきたく思います。
よろしくお願い致します。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2008-01-28 16:29
ホスト名に"_"(アンダーバー)が入っているとIEはクッキーを受け付けないようです。
アンダーバーを使ってますか?
引用:

mkonishi1981さんの書き込み (2008-01-28 15:06) より:
しばらくは値が取得できて動作する場合もあれば、
画面遷移を一度した時点で例外が発生する場合もあります。


ということから、違う原因のような気がしますけど、一応参考になればと。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-01-28 16:44
引用:

mkonishi1981さんの書き込み (2008-01-28 15:06) より:
上のコードの処理があり、
Response.Redirect("B.aspx");
で遷移してから、クッキーを参照しています。


どういったタイミングでその遷移をしているのでしょうか?ブラウザーが cookie を食う前に遷移しているということはないでしょうか?
A.aspx と B.aspx の間にもうワンクッションなにか存在しているのでしょうか?
それとも A.aspx の中で Response.Redirect("B.aspx"); をやられているのでしょうか?それはちょっと変な気がします?いいのかな?

また、ブラウザーが cookie を食ったかどうかは、たとえば IE だったらアドレス欄に、
javascript:document.cookie;
を入力すれば分かります。
mkonishi1981
会議室デビュー日: 2008/01/28
投稿数: 2
投稿日時: 2008-01-28 17:54
回答ありがとうございます。
おかげさまで解決できましたので、経緯を報告します。

>一郎さん
ホスト名にアンダーバーは使っていなかったです。
ただ、この事は知らなかったので本番環境の構築で気をつけたいと思います。

>unibonさん
A.aspxのボタンクリックイベントの処理で、
クッキーへの値のセットと、Response.Redirect("B.aspx")を実行しています。

教えていただいたように、javascript:document.cookie;
で確認してみると、以下のようにブラウザはクッキーを食べているようです。

USER_ID=user02; USER_NM=5"em]~f]~|g~v00 ENTERPRISE_ID=0000000002;

ただ気になったのが、USER_NMにセットした日本語が文字化けして
次のENTERPRISE_IDとの区切りの";"がなくなっていました。
これによって、ENTERPRISE_IDが参照できなくなっていると思い
名称を英文字のみに変えてみたところ、現象が発生しないようになりました。
ですので、日本語を扱う部分を以下のようにして対応しました。

[値をセットする処理]
Response.Cookies["USER_NM"].Value = "テストユーザ";

Response.Cookies["USER_NM"].Value = Server.UrlEncode("テストユーザ");

[値を参照する処理]
lblUser.Text = Request.Cookies["USER_NM"].Value;

lblUser.Text = Server.UrlDecode(Request.Cookies["USER_NM"].Value);

これで解決できたと思います。
ありがとうございました。
1

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