2013-10-17 1 views
2

C# MVC 4를 사용하고 보고서 뷰어 aspx 페이지를 포함하여 SSRS에서 보고서를 렌더링했습니다. SQL Server 2008R2, Microsoft.ReportViewer.WebForms 버전 11.0을 사용하고 있습니다. 보고서 뷰어 및 세션 관련 문제

첫째 문제 내가 직면하고

,

나는 사이트에 상대 값을 유지하기 위해 프로젝트 내에서 세션 변수를 사용하고 있습니다. SSRS와는 아무 관련이 없습니다 (예 : UserId). 의 Web.config에서

나는

주가 : 제한 시간이 테스트 시나리오에 대한 터무니없이 높게 설정되어있다.

마찬가지로 SessionServerout 키가 60 인 ReportServer 데이터베이스에서 ConfigurationInfo를 업데이트했습니다 (다시 말하지만 테스트 할 가치가 있습니다).

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(); 
      } 
     } 

내가 로그인하면 내가

직면하고 문제, 내가 세션에서 설정 한 값이 : 열기 위해 다음과 같이

내의 ReportViewer 코드입니다. 보고서를 열면 보고서가 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) 

다음과 같은 오류를 얻을 키를 검색하려고하지만 경우 보고서 세션이 완료되기 전에 시간 초과되었습니다.

아이디어가 있으십니까?

추가 정보가 필요하면 질문을 업데이트하십시오.

미리 감사드립니다.

+0

흠, ReportViewer.KeepSessionAlive 속성을 사용해 보셨습니까? –

+0

@DTs -이 방법을 시도해 보았습니다.하지만 몇 가지 시도가있을 때 제대로하지 못했을 수 있습니다. – Kamal

답변

3

동일한 문제가 발생했습니다. ReportViewer가 Session에 넣는 개체에 액세스하면 보고서 서버에 ping을 시도합니다. 보고서가 만료 된 경우 ReportServerException이 발생합니다.이 보고서는 사용자가 만료 된 보고서를보고 있지만 더 이상 해당 페이지에 있지 않을 때 예상되는 동작입니다.

불행히도 이러한 세션 항목은 사용자가 ReportViewer가 포함 된 페이지를 떠난 후에 정리되지 않습니다.그리고 어떤 이유로 세션의 키 목록에 액세스하면 보고서 서버가 ping되도록 트리거되므로 전혀 관련이없는 페이지에서이 예외가 발생합니다.

우리는 키 목록을 가져올 수 없지만 세션에있는 항목의 수는 우리가 액세스 할 수있는 한 가지입니다. 이 정보를 사용하여 Session의 각 항목을 검토하고 ReportViewer와 연결된 항목인지 확인한 다음 제거 할 수 있습니다. 은 if 문에서 유형 검사가 아직 만료되지 않은 보고서를 제거하면서

[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 블록은 이미 만료 (및 액세스 할 때 따라서 예외를 throw) 한 보고서를 제거하는 데 도움이됩니다.

ReportViewer가 포함 된 페이지의 onunload 이벤트에서 호출하는 것이 좋습니다.