トップ回答者
MVC アプリで別なアクションを呼び出すと、前に設定していた Session のパラメータが消失する

質問
-
お世話になっております、おのでらです。
特定の環境で Session にパラメータを設定しても次のアクションで Session のパラメータが消えてしまう(null)現象が発生しましたので質問させていただきます。
【開発環境】
■ローカル環境
・Windows Vista SP2
・IE 9
・Visual Studio 2010 SP1
・ASP.NET 4.0 MVC 3
・ドメイン
・ユーザー「A」(ローカルアカウント)■サーバー環境
・Windows Server 2008 R2 Standard
・IIS 7.5
・ASP.NET 4.0 MVC 3
・ワークグループ
・IE 8
・ユーザー「Administrator」
・ユーザー「A」(ローカルアカウント、パスワードはローカルと同じ)■プログラム
・イントラネットアプリケーション (MVC 3 のテンプレート)
・アプリケーションはローカルで作成し、サーバーへは配置のみ■IIS
・認証:Windows 認証のみ
・アプリケーションプール:.NET 4.0 統合
・セッション状態:インプロセス or 状態サーバー (どちらでも現象は同じ)
【発生している問題】MVC アプリケーションの Controller クラスのアクションメソッド内で Session 変数にパラメータを設定してビューを返しているのですが、ブラウザ側で別のアクション(リンクをクリック)を呼び出すと Session に設定していたパラメータが消えてしまいます。コードは下のような簡単なものでも発生します。
public ActionResult Index() { Session["TestSession"] = "セッションテキスト。"; return View(); } public ActionResult Index4() { var model = <インスタンス作成コード>; // ビューに表示するメッセージ model.SystemMessage = Session["TestSession"].ToString(); return View(model); }
ただし、Session が消えるのはすべての環境ではなく、以下の状況で発生します。
■ローカル環境の Visual Studio からデバッグ実行した場合
または、直接 Web ブラウザから「http://localhost:xxxx/」を開いた場合⇒正常に Session の値を取得できる。
■サーバー環境にアプリケーションを配置し「サーバー内」のWebブラウザから直接「http://localhost/xxxx」を開いた場合
⇒正常に Session の値を取得できる。■サーバー環境にアプリケーションを配置し「ローカル環境」からWebブラウザで「http://サーバー名/xxxx」を開いた場合
⇒Session["TestSession"].ToString(); で NullReferenceException
セッションタイムアウトが原因かとも思いましたが、10秒と満たない操作でも必ず Session パラメータが消えてしまうので、何らかの原因、または設定の要因でリクエスト時に Session が無くなってしまっているのだと思います。しかし、2日ほどかけて IIS の設定を変更したり、プログラムを変えて試しているのですがいまだ解決できない状態でいます。
何か心当たりのある方、情報をお待ちしております。
おのでら (http://sorceryforce.com/)
回答
-
> プロキシの設定とかはネットワーク管理者が一貫して行うものだと思って
> いたのでそこは見ていませんでした。プロキシサーバーはネットワーク管理者が設置するかもしれませんが、それ
を利用するためのブラウザの設定はクライアント側でしか行えないはずです。
その設定も管理者が行うということはあるかもしれませんが。> おそらく DNS の設定あたりに問題がありそうな気がするので後で確認し
> てみようかと思っています。名前解決に DNS を使っているのでしょうか? サーバーは WORKGROUP に
属しているとのことですが、そうだとすると、DNS への登録は不要だと思
いますが。というより、DNS にサーバーのコンピューター名と IP が登録されている
とすると、それで話がややこしくなっているような気がします。Fiddler などのパケットキャプチャツールで HTTP 要求/応答のヘッダー
に含まれるセッションクッキーの授受が正しく行われているかチェックし
てはいかがでしょう。- 回答としてマーク おのでら_ 2011年11月7日 0:50
すべての返信
-
> 一応同一サブネットマスク内なのでプロキシを通してはいないのですが、
> ネットワーク部分は私はかかわっていないので確認してみます。ナットワーク管理者に聞かなくても、プロキシを通っているかどうか分か
るのではないでしょうか?インターネットオプションで[接続]タブで[LAN の設定(L)]ボタンをク
リックするとプロキシサーバーを使用しているかどうかが分かると思います。ある程度の管理がされていれば、社内から社外のサイトにアクセスする場合
はプロキシ経由以外許可していないと思います。localhost が問題なかったのは、例外に設定してあるからではないですか?
([詳細設定]ボタンをクリックして例外設定を見てください)
こんなことは言われるまでもなく承知しているということでしたら失礼し
ました。 -
SurferOnWww さん回答ありがとうございます。
> ナットワーク管理者に聞かなくても、プロキシを通っているかどうか分かるのではないでしょうか?
>インターネットオプションで[接続]タブで[LAN の設定(L)]ボタンをクリックするとプロキシサーバーを使用しているかどうかが分かると思います。
プロキシの設定とかはネットワーク管理者が一貫して行うものだと思っていたのでそこは見ていませんでした。今現地にいないので明日確認してみます。(ただ社内ではとくにプロキシの話は聞いたことないので多分設定されていないと思っています)
>localhost が問題なかったのは、例外に設定してあるからではないですか?
IE のプロキシ設定はした覚えがないので(クライアントもサーバーも)多分ここではないような気がしています。
後、いろいろ確認しててひとつわかったことがあります。Web サーバーに対して URL にサーバー名を入れてアクセスするとセッションが消えてしまうのですが、IP アドレスを URL に入れると正常に動作することがわかりました。おそらく DNS の設定あたりに問題がありそうな気がするので後で確認してみようかと思っています。
おのでら (http://sorceryforce.com/)- 編集済み おのでら_ 2011年11月4日 2:13
-
> プロキシの設定とかはネットワーク管理者が一貫して行うものだと思って
> いたのでそこは見ていませんでした。プロキシサーバーはネットワーク管理者が設置するかもしれませんが、それ
を利用するためのブラウザの設定はクライアント側でしか行えないはずです。
その設定も管理者が行うということはあるかもしれませんが。> おそらく DNS の設定あたりに問題がありそうな気がするので後で確認し
> てみようかと思っています。名前解決に DNS を使っているのでしょうか? サーバーは WORKGROUP に
属しているとのことですが、そうだとすると、DNS への登録は不要だと思
いますが。というより、DNS にサーバーのコンピューター名と IP が登録されている
とすると、それで話がややこしくなっているような気がします。Fiddler などのパケットキャプチャツールで HTTP 要求/応答のヘッダー
に含まれるセッションクッキーの授受が正しく行われているかチェックし
てはいかがでしょう。- 回答としてマーク おのでら_ 2011年11月7日 0:50
-
SurferOnWww さん、小野@どっとねっとふぁん さん回答ありがとうございます。
>IEの場合、「LANにプロキシサーバーを使用する」という設定があります。サーバー名とIPアドレスを指定した場合で動きが違うのであればこのあたりが気になります
まずここを見てみましたが、チェックはついていませんでした。(ほかのPC2台でも見てみましたがそれぞれチェックはついていません、IE6 と IE8 です)。ただ、Fiddler 実行していると勝手にチェックついてしまうようですね。
SurferOnWww さんに教えていただいた Fiddler を使ってみました。IPアドレスで接続した場合は Cookie があったのですが(ASP.NET_SessionId など)、ホスト名で指定した場合は Cookie がありませんでした。セッションがなくなる原因はこれみたいですね。(Cookie が消える理由がわかっていませんが)
ほかに検証として IPアドレス、ホスト名の URLをそれぞれ、IEのセキュリティの「ローカル イントラネット」「信頼済みサイト」に入れてみてアクセスしてみたのですが、現象に変化はありませんでした。
あと、ほかのブラウザでも試してみたのですが、ブラウザごとに動作が異なるみたいです。IE設定が原因かなーとおも思えるのですが…
【IE6 (仮想OS A ドメイン)】
IPアドレス:正常に動作
ホスト名:Session NullReferenceException【IE8 (仮想OS B ドメイン)】
IPアドレス:正常に動作
ホスト名:Session NullReferenceException【IE9】
IPアドレス:正常に動作
ホスト名:Session NullReferenceException【Google Chrome 15】
IPアドレス:正常に動作
ホスト名:正常に動作【Opera 11.51】
IPアドレス:接続タイムアウト
ホスト名:正常に動作【FireFox 7】
IPアドレス:正常に動作
ホスト名:正常に動作- 編集済み おのでら_ 2011年11月4日 2:35
-
> Fiddler 実行していると勝手にチェックついてしまうようですね。
それは Fiddler 自体がプロキシとして間に入ることによりパケットをキャ
プチャしているからです。
> ホスト名で指定した場合は Cookie がありませんでした。セッションがな
> くなる原因はこれみたいですね。(Cookie が消える理由がわかっていませ
> んが)「Cookie が消える理由」がわからないと先に進まないですね。
ブラウザで Cookie の受け入れを拒否しているとか、Cookie を受けたペー
ジと次に要求を送るページとでドメインが違うことぐらいしか理由が考え
つきませんが、正常動作する場合があるということなので、それらは理由
ではなさそうですし、こちらでは正直言って見当がつきません。正常に動作する場合と NG の場合で具体的に何が違うか、Fiddler でヘッダ
ーの内容などを見て詳細に調べてはいかがですか。それぐらいしか解決の糸
口を見つける手段はなさそうな気がします。