3

私は c# MVC 4 を使用しており、レポート ビューアー aspx ページを埋め込んで、SSRS からレポートを表示しています。Sql Server 2008R2、Microsoft.ReportViewer.WebForms バージョン 11.0 を使用しています。

まず私が直面している問題は、

プロジェクト内でセッション変数を使用して、サイトに関連する値を保持しています。これらは、SSRS とは何の関係もありません (UserId など)。

私が持っているweb.configで

注: このテスト シナリオでは、タイムアウトが非常に高く設定されています。

同様に、キー SessionTimeout の ReportServer データベースの ConfigurationInfo を 60 に更新しました (これも、テストするにはばかげた値です)。

私のReportViewerコードは次のとおりです。

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ReportViewer1.Reset();
                string Reportpath = Request["ReportName"];
                string ServerUserName = ConfigurationManager.AppSettings["ReportServerUser"];
                string ServerPassword = ConfigurationManager.AppSettings["ReportServerPwd"];
                string ReportServerDomain = ConfigurationManager.AppSettings["ReportServerDomain"];
                string ReportsPath = ConfigurationManager.AppSettings["ReportsPath"];
                ReportViewer1.ProcessingMode = ProcessingMode.Remote;

                // Get report path from configuration file
                ReportViewer1.ServerReport.ReportServerUrl = new Uri(ConfigurationManager.AppSettings["ReportServer"]);
                ReportViewer1.ServerReport.ReportPath = String.Format(ReportsPath + "/" + Reportpath);

                IReportServerCredentials irsc = new CustomReportCredentials(ServerUserName, ServerPassword, ReportServerDomain);
                ReportViewer1.ServerReport.ReportServerCredentials = irsc;
                ReportViewer1.ShowPrintButton = false;

                #region Parameters for report
                Microsoft.Reporting.WebForms.ReportParameter[] reportParameterCollection = new Microsoft.Reporting.WebForms.ReportParameter[1];
                reportParameterCollection[0] = new Microsoft.Reporting.WebForms.ReportParameter();
                reportParameterCollection[0].Name = "Example";
                reportParameterCollection[0].Values.Add("Example");

                ReportViewer1.ServerReport.SetParameters(reportParameterCollection);
                #endregion Parameters for report
                ReportViewer1.ServerReport.Refresh();
            }
        }

私が直面している問題

ログインすると、セッションに値が設定されます。レポートを開くと、レポートは 1 秒以内に正常に実行され、ページに表示されます。

舞台裏で、レポート サーバーの一時 DB に行が挿入され、有効期限が 1 分後に設定されていることに気付きました (私の設定による)。

セッションキーが私の

HttpContext.Current.Session.Keys

この時点で問題なく、レポート ページを閉じます。

この時点で、ReportServerTempDB でセッションが期限切れになるまで 1 分待ちます。

次に、値として HttpContext.Current.Session を使用するアクションのページに移動します。繰り返しますが、このアクションはレポートとは関係ありません。ただし、キーを取得しようとすると、次のエラーが発生します

Microsoft.Reporting.WebForms.ReportServerException: The report execution <key> has expired or cannot be found. (rsExecutionNotFound)

私はこれをグーグルで検索しましたが、実行が完了する前にレポートセッションがタイムアウトした長時間実行レポートでほとんどの人がこれを経験しているように見えるため、私の問題に対する有効な解決策は見つかりませんでした。

何か案は?

さらに情報が必要な場合はコメントしてください。質問を更新します。

前もって感謝します

4

2 に答える 2

3

私は同じ問題に遭遇しました。ReportViewer が Session に配置したオブジェクトにアクセスすると、レポート サーバーに ping を実行しようとするようです。レポートの有効期限が切れている場合、ReportServerException がスローされます。これは、ユーザーがまだ期限切れのレポートを表示している場合に想定される動作ですが、そのページにアクセスしていない場合には想定されません。

残念ながら、ユーザーが ReportViewer を含むページを離れた後、これらのセッション エントリはクリーンアップされません。また、何らかの理由で、セッション内のキーのリストにアクセスすると、レポート サーバーへの ping がトリガーされ、まったく関係のないページでこの例外が発生します。

キーのリストを取得することはできませんが、アクセスできることの 1 つは、Session のエントリ数です。この情報を使用して、Session 内の各項目を確認し、それが ReportViewer に関連付けられている項目の 1 つであるかどうかを判断して削除できます。

[WebMethod]
public static void RemoveReportFromSession()
{
    var i = HttpContext.Current.Session.Count - 1;

    while (i >= 0)
    {
        try
        {
            var obj = HttpContext.Current.Session[i];
            if (obj != null && obj.GetType().ToString() == "Microsoft.Reporting.WebForms.ReportHierarchy")
                HttpContext.Current.Session.RemoveAt(i);
        }
        catch (Exception)
        {
            HttpContext.Current.Session.RemoveAt(i);
        }

        i--;
    }
}

catch ブロックは、既に期限切れになっているレポートを削除するのに役立ちます (したがって、アクセスすると例外がスローされます)。一方、if ステートメントの型チェックは、まだ期限切れになっていないレポートを削除します。

ReportViewer を含むページの onunload イベントからこれを呼び出すことをお勧めします。

于 2016-03-16T19:41:02.943 に答える