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

  • 質問

  • お世話になっております、おのでらです。

    特定の環境で 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/)
    2011年11月1日 4:48

回答

  • > プロキシの設定とかはネットワーク管理者が一貫して行うものだと思って
    > いたのでそこは見ていませんでした。

    プロキシサーバーはネットワーク管理者が設置するかもしれませんが、それ
    を利用するためのブラウザの設定はクライアント側でしか行えないはずです。
    その設定も管理者が行うということはあるかもしれませんが。

    > おそらく DNS の設定あたりに問題がありそうな気がするので後で確認し
    > てみようかと思っています。

    名前解決に DNS を使っているのでしょうか? サーバーは WORKGROUP に
    属しているとのことですが、そうだとすると、DNS への登録は不要だと思
    いますが。

    というより、DNS にサーバーのコンピューター名と IP が登録されている
    とすると、それで話がややこしくなっているような気がします。

    Fiddler などのパケットキャプチャツールで HTTP 要求/応答のヘッダー
    に含まれるセッションクッキーの授受が正しく行われているかチェックし
    てはいかがでしょう。

     

    2011年11月3日 11:38
  • Host名にアンダーバーがあるとか。。。
    2011年11月7日 0:08

すべての返信

  • ローカル環境でテストサーバーで実行した場合はOKなので、ブラウザがクッキーを受け付けない、とかではなさそう。

    サーバーに置いたときサーバ内のブラウザから実行した場合もOKのなので、サーバー上の設定でセッションが保持できないわけではなさそう。

    となると、間の通信経路かなぁ。
    ダメなときだけプロキシ通ってるとかありません?


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年11月1日 7:19
  • 小野@どっとねっとふぁん さん回答ありがとうございます。

     

    一応同一サブネットマスク内なのでプロキシを通してはいないのですが、ネットワーク部分は私はかかわっていないので確認してみます。

    追加情報なのですが、ローカル環境は物理PC上で動作しており、サーバー環境は VMWare のクライアントとして動作しています。(VMWare ホストは別PC)


    おのでら (http://sorceryforce.com/)
    2011年11月2日 1:00
  • > 一応同一サブネットマスク内なのでプロキシを通してはいないのですが、
    > ネットワーク部分は私はかかわっていないので確認してみます。

    ナットワーク管理者に聞かなくても、プロキシを通っているかどうか分か
    るのではないでしょうか?

    インターネットオプションで[接続]タブで[LAN の設定(L)]ボタンをク
    リックするとプロキシサーバーを使用しているかどうかが分かると思います。

    ある程度の管理がされていれば、社内から社外のサイトにアクセスする場合
    はプロキシ経由以外許可していないと思います。

    localhost が問題なかったのは、例外に設定してあるからではないですか?
    ([詳細設定]ボタンをクリックして例外設定を見てください)


    こんなことは言われるまでもなく承知しているということでしたら失礼し
    ました。

    2011年11月3日 4:39
  • SurferOnWww さん回答ありがとうございます。

    > ナットワーク管理者に聞かなくても、プロキシを通っているかどうか分かるのではないでしょうか?

    >インターネットオプションで[接続]タブで[LAN の設定(L)]ボタンをクリックするとプロキシサーバーを使用しているかどうかが分かると思います。

    プロキシの設定とかはネットワーク管理者が一貫して行うものだと思っていたのでそこは見ていませんでした。今現地にいないので明日確認してみます。(ただ社内ではとくにプロキシの話は聞いたことないので多分設定されていないと思っています)

    >localhost が問題なかったのは、例外に設定してあるからではないですか?

    IE のプロキシ設定はした覚えがないので(クライアントもサーバーも)多分ここではないような気がしています。

     

    後、いろいろ確認しててひとつわかったことがあります。Web サーバーに対して URL にサーバー名を入れてアクセスするとセッションが消えてしまうのですが、IP アドレスを URL に入れると正常に動作することがわかりました。おそらく DNS の設定あたりに問題がありそうな気がするので後で確認してみようかと思っています。

     

     


    おのでら (http://sorceryforce.com/)
    2011年11月3日 6:21
  • > プロキシの設定とかはネットワーク管理者が一貫して行うものだと思って
    > いたのでそこは見ていませんでした。

    プロキシサーバーはネットワーク管理者が設置するかもしれませんが、それ
    を利用するためのブラウザの設定はクライアント側でしか行えないはずです。
    その設定も管理者が行うということはあるかもしれませんが。

    > おそらく DNS の設定あたりに問題がありそうな気がするので後で確認し
    > てみようかと思っています。

    名前解決に DNS を使っているのでしょうか? サーバーは WORKGROUP に
    属しているとのことですが、そうだとすると、DNS への登録は不要だと思
    いますが。

    というより、DNS にサーバーのコンピューター名と IP が登録されている
    とすると、それで話がややこしくなっているような気がします。

    Fiddler などのパケットキャプチャツールで HTTP 要求/応答のヘッダー
    に含まれるセッションクッキーの授受が正しく行われているかチェックし
    てはいかがでしょう。

     

    2011年11月3日 11:38
  • IEの場合、「LANにプロキシサーバーを使用する」という設定があります。
    サーバー名とIPアドレスを指定した場合で動きが違うのであればこのあたりが気になります。

    #IPアドレスを指定した場合、IEはインターネット環境だと判断して接続するのでこの設定が反映されません。

    このあたりを含め、IEの設定までポリシーで設定されることはあり得ます。
    ただ、現在の設定は確認できるはずですから、まず確認してみるのがよいと思います。


    あおい情報システム株式会社 小野修司(どっとねっとふぁん)
    2011年11月4日 1:16
  • 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:27
  • > Fiddler 実行していると勝手にチェックついてしまうようですね。

    それは Fiddler 自体がプロキシとして間に入ることによりパケットをキャ
    プチャしているからです。


    > ホスト名で指定した場合は Cookie がありませんでした。セッションがな
    > くなる原因はこれみたいですね。(Cookie が消える理由がわかっていませ
    > んが)

    「Cookie が消える理由」がわからないと先に進まないですね。

    ブラウザで Cookie の受け入れを拒否しているとか、Cookie を受けたペー
    ジと次に要求を送るページとでドメインが違うことぐらいしか理由が考え
    つきませんが、正常動作する場合があるということなので、それらは理由
    ではなさそうですし、こちらでは正直言って見当がつきません。

    正常に動作する場合と NG の場合で具体的に何が違うか、Fiddler でヘッダ
    ーの内容などを見て詳細に調べてはいかがですか。それぐらいしか解決の糸
    口を見つける手段はなさそうな気がします。

     

    2011年11月4日 12:50
  • Host名にアンダーバーがあるとか。。。
    2011年11月7日 0:08
  • SurferOnWww さん、かるあさん回答ありがとうございます。

    Host名にアンダーバーがあるとか。。。

     完全に盲点でした…。確かにホスト名にはアンダーバーがついています。検索してみると結構出てきますね^^。IE だけが Cookie 消えてしまうのも納得できました。

    とりあえず開発環境上のサーバー名ですので対処は可能かと思います。いろいろ回答してくださった方々ありがとうございました。


    おのでら (http://sorceryforce.com/)
    2011年11月7日 0:44