3

次のような状況があります。

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 を使用するレポートを取得したりできる場所はどこですか?

4

2 に答える 2

1

ベースページクラスから派生したカスタムページを使用して解決しました。セッションが新しいかどうかを確認し、同じページにリダイレクトして、レポートを最初から再読み込みします。

また、レポート ビューアーは単独でセッションを維持するわけではないため、スクリプトを使用してセッションを維持しました。しかし、私はセッション チェックに満足しているので、無効にしました。

public class ReportPage: System.Web.UI.Page
{

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        #region check for lost session
        if (Context.Session != null)
        {
            if (Session.IsNewSession)
            {
                string cookieHeader = Request.Headers["Cookie"];
                if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    Response.Redirect(Request.Url.ToString());
                }
            }
        }

        #endregion check for lost session

        #region generate keepsessionalive script 


        StringBuilder sb = new StringBuilder();
        sb.Append("$(function () {setInterval(KeepSessionAlive, " + GetSessionTimeoutInMs() + ");");
        sb.Append("});");
        sb.Append("function KeepSessionAlive() {");
        sb.Append(string.Format("$.post('{0}', null);", ResolveUrl("~/KeepSessionAlive.ashx")));
        sb.Append("};");

        // register on page
         Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SessionKeepAlive", sb.ToString(), true);

        #endregion generate keepsessionalive script
    }

    private int GetSessionTimeoutInMs()
    {
        return (this.Session.Timeout * 60000) - 10000;           
    }
}

keep-alive-script は、呼び出されるたびにセッションにアクセスする http ハンドラー (.ashx ファイル) を呼び出します (実際にこれが必要かどうかはわかりません)。ここに記録があります:

 public class KeepSessionAlive : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        context.Session["KeepSessionAlive"] = "KeepAlive!";
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
于 2010-08-11T12:04:43.303 に答える
0

ワーカー プロセスの数を 1 に制限しようとしましたか?

私は同じ問題を抱えていましたが、それを修正したのはA) setting a specfic time of day for recycle(あなたがすでに持っている)とB) limit worker processes to max of 1 in app pool settings.

于 2010-08-03T19:59:35.437 に答える