2

ReportViewer コントロールが SessionState を使用する方法に問題があります。

背景 : RemoteServer モードで ReportViewerControl を使用する .NET 3.5 WebForms アプリがあります。

私たちのアプリケーションは、SessionState を必要とするフレームワークを (SQL Persistence を使用して) 使用しているため、ReportViewer コントロールも SessionState にフックされているようです。

RV のセッション ステートの使用には問題があります。

  1. すぐに追加の 9k のシリアライゼーションが必要です (dbo.ASPStateTempSessions 内)。
  2. レポートを表示した後、以降のすべてのページで RV セッション状態が逆シリアル化されます (つまり、reportviewer コントロールがない場合でも、すべてのページ)。これには、SSRS サーバーへの接続に使用される資格情報のシリアル化が含まれます。

ある時点で、SSRS がその側で実行をクリーンアップすると、これは必然的に rsExecutionNotFound 例外につながります (レポート実行 xyz の有効期限が切れているか、見つかりません)。

他の人は、RV によるこのやや失礼な SessionState の動作をどのように解決しましたか?

現在の考えでは、RV が SessionState をまったく使用しないようにすることです。たとえば、RV 用に別の ASP アプリケーションを作成し、RV コントロールをアプリに IFrame することによってです。

または、SessionState デシリアライゼーションの問題をトラップして RV のキーを削除する方法はありますか?

どんなアドバイスでも大歓迎です!

編集:

SessionState が IIS で処理されている場合、SessionState の逆シリアル化の問題はおそらく発生しません。

Fiddler を使用すると、SessionState の逆シリアル化中に、ページに RV コントロールがない場合でも、SSRS への複数の接続が観察されます (おそらく、シリアル化された RV エンティティと資格情報の「セッター」が実際に SSRS に再接続します)。

ただし、画面上で SessionState から RV キーを削除すると、ページングなどの Ajax RV コントロール機能が機能しなくなります (つまり、RV から ExecutionId を収集し、使用時に削除することはできません)。

ATM の唯一の解決策は、RV コントロールを持たないページの SessionState から RV キーを削除する「ハック」を実装することです (ユーザーがレポート ページから離れた場合に、SSRS の前にクリーンアップできることを期待して)タイムアウト)、global.asax Application_Error で AspNetSessionExpiredException と ReportServerException をトラップし、セッションを破棄してクリアし、ユーザーをログインにリダイレクトします (ユーザーが RV 画面を開いたままにしてタイムアウトした場合)。残念ながら、dbo.ASPStateTempSessions から直接データを削除すると、独自の SessionState が強制終了されます (SSRS がセッションを期限切れにするか実行を削除すると、SessionState を逆シリアル化できなくなることに注意してください)。

この動作は、RV2008 と RV2010 の両方で観察されます (SSRS 2008R2 を使用)

4

0 に答える 0