次のような状況があります。
Microsoft Report Viewer 2010 は、ASP.NET Web アプリケーションのローカル モードでレポート (.rdlc ファイル) を表示するために使用されます。レポート データは、ASPX ページのコード ビハインドでデータソースを割り当てることによって提供されます。次に例を示します。
if(!IsPostBack){
ReportViewer1.Reset();
ReportDataSource reportDataSource = new ReportDataSource();
reportDataSource.Name = "DataContainerType";
reportDataSource.Value = DatasourceOnPage;
reportDataSource.DataSourceId = "DatasourceOnPageID";
reportDataSource.DataMember = "DataSourceView";
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.DisplayName = "ReportName";
ReportViewer1.LocalReport.ReportEmbeddedResource = "Reportfile.rdlc";
ReportViewer1.LocalReport.DataSources.Add(reportDataSource);
}
通常、これはうまく機能し、すべてのレポートが問題なく読み込まれます。
ワーカー プロセスがリサイクルされるまでページを開いたままにし、レポートを更新するか、レポート ページで何らかの種類のポストバックを実行しようとすると、(未処理の) 例外 "ASP.NET セッションの有効期限が切れました" が発生します。
例外情報: 例外の種類: AspNetSessionExpiredException 例外メッセージ: ASP.NET-Sitzung ist abgelaufen order konnte nicht gefunden >werden. Microsoft.Reporting.WebForms.ViewerDataOperation..ctor() で Microsoft.Reporting.WebForms.HttpHandler.GetHandler(String operationType) で Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext コンテキスト) で >System.Web.HttpApplication.CallHandlerExecutionStep .System.Web.HttpApplication.IExecutionS>tep.Execute() System.Web.HttpApplication.ExecuteStep で (IExecutionStep ステップ、ブール値 & >completedSynchronously)
IIS は毎朝 5 時にリサイクルするように設定されています。web.config で InProc 設定を使用しているため、明らかにセッションが失われます。ASP.NET の動作を正しく理解していれば、未処理の例外によってワーカー プロセスが終了するはずです。次のリクエストが到着したときに、新しいワーカー プロセスが存在するはずです。
セッション タイムアウトの設定が低い場合、同じ例外が発生します。私が読んだところによると、Report Viewer はサーバーに ping を実行してセッションを維持する必要があるため、これは奇妙に思えます。
例外をキャッチしようとしましたが、ページの読み込み時にアクセスする前に、ReportViewer コントロール内のどこかにスローされました。IsPostBack を取り出しても上記のコードは実行されますが、効果はありません。
セッションをプロセスに保持する代わりに状態サーバーを使用しようとしたため、セッションは失われませんが、これによりレポート ビューアーから他のエラーが発生します。状態サーバーにセッション データを保存できないようです。
環境は Windows Server 2003 .NET 4.0 Report Viewer 2010
ワーカー プロセスを終了させずにエラーを処理したり、stateserver を使用するレポートを取得したりできる場所はどこですか?