Developers / Create Designer and Viewer Applications / Js Viewer Application / Caching Reports
Caching Reports

Caching reports is a great technique to improve the performance of report rendering and is extremely beneficial for large reports with an infrequent change of data, like periodic reports that generate monthly or weekly.

The Js Viewer backends read a report as many times as required. However, sometimes you may need to cache the report as demonstrated in the example below.

Startup.cs
Copy Code
app.UseReportViewer(settings =>
{
    settings.UseReportProvider(new ReportProvider());
});
ReportProvider.cs
Copy Code
public class ReportProvider : IReportProvider
  {
      public Stream GetReport(string reportId)
      {
          PageReport report = new PageReport();
          var cache = new MemoryCache(new MemoryCacheOptions { SizeLimit = 10000 });
          cache.GetOrCreate(reportId, entry =>
          {
              entry.SetSlidingExpiration(TimeSpan.FromSeconds(30));
              report = new PageReport(new FileInfo(Path.Combine(@"C:\Reports", reportId)));
              return new MemoryStream(Encoding.ASCII.GetBytes(report.ToRdlString()));
          });

          return new MemoryStream(Encoding.ASCII.GetBytes(report.ToRdlString()));  
      }

      public ReportDescriptor GetReportDescriptor(string reportId)
      {            
          switch (Path.GetExtension(reportId))
          {
              case ".rdlx": return new ReportDescriptor(ReportType.RdlXml);
              case ".rdf": return new ReportDescriptor(ReportType.Rdf);
              case ".rdlx-master": return new ReportDescriptor(ReportType.RdlMasterXml);
              case ".rpx": return new ReportDescriptor(ReportType.RpxXml);
              default: return null;
          }
      }
  }