none
レポートのエクスポート時に「ASP.netセッションの有効期限が切れています」のエラーが表示される RRS feed

  • 質問

  • Asp.Netで、ページ上にReportViewerクラス(Microsoft.Reporting.WebForms.ReportViewer)を使ってReportingServicesのレポートを表示しているアプリケーションがあります。

    このアプリケーションでレポートを表示し、エクスポートの操作をした時に下記のエラーが表示される事があります。

    一部のクライアントで発生し、発生頻度も不定です。(同じクライアントで正しく動く場合もある)

    http://support.microsoft.com/kb/316112/ja にセッションに関する記述がありますが、こちらに該当しないことは確認済みです。

    他に原因として考えられるものは無いでしょうか?

    [AspNetSessionExpiredException: ASP.NET セッションの有効期限が切れています]
    Microsoft.Reporting.WebForms.ReportDataOperation..ctor() +722
    Microsoft.Reporting.WebForms.HttpHandler.GetHandler(String operationType) +303
    Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context) +57
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171

    サーバ・クライアントの環境は以下の通りです。

    OS:Windows2008R2

    DB:SQLSERVER2012Std

    クライアントブラウザ:IE8

    • 移動 星 睦美 2015年7月15日 6:47 SQL Server BI から
    2015年7月15日 6:19

すべての返信

  • ReportViewer と Session はもともと何の関係もないはずです。

    質問者さんの Web アプリケーションの作り方の問題で、どこかで Session を使うようになっていて(例えば、ReportViewer が使うデータの保存場所に使っているとか)、ユーザーが閲覧しているうちにタイムアウトになってしまったというようなことではないのでしょうか。

    今の質問に書いてある情報だけでは、そういう想像ぐらいしか出来ません。

    Session をどのように使っているかを詳しく書いてもらえないと、たぶんそれ以上のことは掲示板に書いてある以上のことは知りえない第三者には分からないと思います。

    2015年7月15日 8:27
  • 【追伸】

    どこでどのように Session を使っているのか分からなければ、対症療法的ですが、アプリケーションルートの web.congfig ファイルで、sessionState 要素の timeout 属性(デフォルトで 20 分)を少し長くして様子を見てみてはいかがですか?

    sessionState 要素 (ASP.NET 設定スキーマ)
    https://msdn.microsoft.com/ja-jp/library/vstudio/h6bb9cz9(v=vs.100).aspx

    2015年7月16日 0:58
  • "AspNetSessionExpiredException" をキーワードにして検索したところ、英語のMSDN フォーラムのスレッドがありました。

    y-ohara さんの事象と同じかどうかわかりませんが、よろしければトラブルシューティングのヒントにご覧いただければと思います。

    Intermittent AspNetSessionExpiredException from ReportViewer 2010/SQL Server 2008: (英語)


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年7月16日 6:05
  • SurferOnWww様:

    回答ありがとうございます。

    アプリケーション上にはコントロールを配置しているのみで、問題のエクスポート操作もこのコントロールの機能として包含されていますので、特にアプリケーション上でセッションを制御している箇所が無い状態です。

    ご提案いただいたSessionStateのTimeOutは別の要件ですでに値を大きくしてあるのですが、これ以上の処理時間がかかる何かが起こっているのかもしれません。操作ログ等を参考に再現できるか検討してみます。

    2015年7月16日 8:04
  • 星 睦美様:

    情報ありがとうございます。

    丁度こちらで遭遇しているのと似た事象です。アプリケーションプールのリサイクル閾値の変更で復旧させているケースがあるようですので、設定やメモリの使用状況など確認してみたいと思います。


    • 回答としてマーク y-ohara 2015年7月16日 8:07
    • 編集済み y-ohara 2015年7月16日 8:29
    • 回答としてマークされていない y-ohara 2015年7月16日 8:33
    2015年7月16日 8:07
  • 先のレスで、

    > ReportViewer と Session はもともと何の関係もないはずです。

    と書きましたけど大間違いでした。すみません。

    以下の記事によると、ReportViewer は再生するのが簡単ではないデータを保存するのにセッションを使うとのことです。

    Did Your Session Really Expire?
    http://blogs.msdn.com/b/brianhartman/archive/2009/02/15/did-your-session-really-expire.aspx

    そして、ポストバックの際などに期待したデータがセッションにないと AspNetSessionExpiredException をスローするとのことです。

    原因として次のことが書かれています:

    (1) 本当にセッションがタイムアウトした。(例:ping をかけてタイムアウトにならないようにしているが、サーバーが忙しいとか接続が不安定で失敗した)

    (2) 要求を処理しているサーバーにセッションがない。(例:セッションのモードが InProc で、Web Garden / Farm 構成になっているとか、ワーカープロセスがリサイクルされた)

    (3) ブラウザがクッキーを受け付けない設定になっている。

    上記 (2), (3) が該当しなければ原因は (1) ということでしょうか。

    星さんが紹介された記事に ReportViewer.KeepSessionAlive のことが書かれていますが、これがデフォルトの true の場合はセッションがタイムアウトしないように ping がかかるのだそうです。


    • 編集済み SurferOnWww 2015年7月16日 10:15 一部訂正
    2015年7月16日 8:33
  • > ご提案いただいたSessionStateのTimeOutは別の要件ですでに値を大きくしてあるのですが、

    すみません、上のレスを見落としてました。

    それで少しも改善がないとすると、原因は上のレスで書いた (1) ではなさそうですね。

    (2) に心当たりはないでしょうか?

    > (2) 要求を処理しているサーバーにセッションがない。(例:セッションのモードが InProc で、
    > Web Garden / Farm 構成になっているとか、ワーカープロセスがリサイクルされた)

     

    質問者さんが立てた別スレッドで SQL Server Reporting Services に関する問題がありましたが、このスレッドの話は ReportViewer に間違いないですよね? SQL Server Reporting Services もセッションを使うそうですが、ASP.NET のセッションとは別物だそうです。(なので、timeout を変えても意味はないようです)

    関係ないかもしれませんがご参考まで。

    Session Timeout during execution
    http://blogs.msdn.com/b/jgalla/archive/2006/10/11/session-timeout-during-execution.aspx

    2015年7月17日 1:59
  • SurferOnWww様:

    >(2) に心当たりはないでしょうか?

    Web Garden は構成していませんし、ワーカープロセスのリサイクルは毎日夜間におこなう設定になっているのみで、メモリの使用量に応じてリサイクルする設定にはなっていませんでした。

    >質問者さんが立てた別スレッドで SQL Server Reporting Services に関する問題がありましたが、

    >このスレッドの話は ReportViewer に間違いないですよね? 

    実際に使用しているアプリケーションはReportViewerを使用したもので、こちらのスレッドに載せているものと同じものです。

    参考記事のご紹介ありがとうございます。確かにASP.netのセッション管理とは異なるもののようですね。

    レポートの処理に時間がかかりすぎている事もセッションの維持に関係しているようですので、操作履歴なども確認してみます。


    • 編集済み y-ohara 2015年7月21日 3:43
    2015年7月21日 3:42
  • とりあえず、Global.asax辺りで、Application_Endイベントでログをとってみると、アプリが再起動しているかは確認できるかもしれません。

    Application_Endイベントなら、HostingEnvironment辺りからアプリがシャットダウンされようとしている理由がとれたはずです。

    まあ、InProcならついでにSession_Endもログとってみてもいいと思います。アプリの再起動などの理由でなければSession_Endでタイミングは取れると思います。

    2015年7月21日 17:50
  • 原因は分かりませんけど、ご参考に、マイクロソフト公式解説書「プログラミング ASP.NET 4」の 17.3.2 章の「セッション状態が失われる理由」に書いてあったことを紹介しておきます。(関係なさそうなことは除く)

    (1) リサイクルは周期的ではあるものの、周期の間隔について一般的な見通しを立てることはできない。

    (2) 一部のアンチウィルスソフトは、web.config ファイルや Global.asax ファイルに変更されたという印をつけることがある。(結果、セッション状態が失われる)

    (3) Bin や App_Code フォルダといった特別なフォルダの内容が更新されたりした場合も同様にセッション状態が失われる。


    以前、上記 (2) で悩んだ人がこのフォーラムにもおられました。

    セッション情報がシリアル化できるものであれば、その格納場所を InProc ではなく(現在これですよね?)、StateServer または SQLServer という手段を取ってはいかがですか? 原因が分からないので対症療法的ではありますが。詳しくは以下のページを見てください。

    セッション状態モード
    https://msdn.microsoft.com/ja-jp/library/ms178586(v=vs.100).aspx

    商用に使うのであれば、InProc モードは論外という意見もあるようですし。

    • 編集済み SurferOnWww 2015年7月22日 0:55 ハイパーリンク張り直し
    2015年7月22日 0:51