IIS 工作进程内存随着每个新的 devexpress 报告的提供而不断增加

问题描述 投票:0回答:1

这是使用 Dotnet Framework 3.5。该报告包含许多高分辨率图像。 我需要知道如何正确处置。

 // ReportViewer.aspx.cs
 protected void Page_Load(object sender, EventArgs e)
 {

     XtraReport report = new XtraReport();
     report.LoadLayout(reportsDirectory + "\\" + Request.Params["rptnme"]);
     //For backward compatibility
     SqlDataSource.DisableCustomQueryValidation = true;
     SqlDataSource.AllowCustomSqlQueries = true;

     //Allow all scripts to be run via devexpress for backward compatibility
     ScriptPermissionManager.GlobalInstance = new ScriptPermissionManager(ExecutionMode.Unrestricted);

     if (report.DataSource is SqlDataSource)
     {
         ParseParams(report);
     }

     if (report.DataSource != null)
     { 
         report.DataSourceDemanded += report_DataSourceDemanded;
         ((SqlDataSource)report.DataSource).ConfigureDataConnection += new ConfigureDataConnectionEventHandler(devReports_Default_ConfigureDataConnection);
     }

     SubReports(report);

     if (Request.Params.Count > 0)
     {
         if (Request.Params["DisplayName"] != null)
         {
             report.DisplayName = Request.Params["DisplayName"];
         }
     }

     if (Request.Params["exptyp"] == "pdf" || Request.Params["exptyp"] == "ALL")
     {
         // Specify export options.
         PdfExportOptions pdfExportOptions = new PdfExportOptions()
         {
             PdfACompatibility = PdfACompatibility.PdfA1b
         };
       
     }

     DocViewer1.OpenReport(report);
     
 }
// ReportViewer.aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
<form id="form1" runat="server">
    <div>
        <dx:ASPxWebDocumentViewer ID="DocViewer1" runat="server"           
          ToolbarMode="Ribbon" DocumentViewerInternal="">
        </dx:ASPxWebDocumentViewer>
    </div>
</form>
</body>
</html>

此代码是 ASP.NET Web 窗体页面的一部分,用于使用 DevExpress 的报告工具加载和显示报告。以下是 Page_Load 方法的详细说明:

  1. 它首先创建一个新的 XtraReport 对象,它代表一个报表。
  2. 然后它从文件加载报告的布局。文件路径是通过连接 reportsDirectory(从应用程序的配置中读取)和报告名称(在请求中作为参数传递)构建的。
  3. 它禁用自定义查询验证并允许对 SqlDataSource 进行自定义 SQL 查询。这样做是为了向后兼容。
  4. 它将 ScriptPermissionManager.GlobalInstance 设置为具有 ExecutionMode.Unrestricted 的新 ScriptPermissionManager,这允许所有脚本通过 DevExpress 运行以实现向后兼容性。
  5. 如果报表的数据源是SqlDataSource,它会调用ParseParams方法来解析报表查询的参数。
  6. 如果报表有数据源,则订阅SqlDataSource的DataSourceDemanded事件和ConfigureDataConnection事件。当需要报表的数据源时,会引发 DataSourceDemanded 事件;当需要配置 SqlDataSource 的数据连接时,会引发ConfigureDataConnection 事件。
  7. 它调用 SubReports 方法来处理报表中的任何子报表。
  8. 如果请求中有参数,则会将报表的显示名称设置为“DisplayName”参数的值。
  9. 如果请求中的“exptyp”参数是“pdf”或“ALL”,它将创建一个新的 PdfExportOptions 对象并将其 PdfACompatibility 属性设置为 PdfACompatibility.PdfA1b。这用于指定将报告导出为 PDF 的选项。然而,实际导出为 PDF 的部分在这段代码中被注释掉了。
  10. 最后,它在 DocViewer1 中打开报表,DocViewer1 是一个向用户显示报表的 ASPxWebDocumentViewer 控件。 每次加载页面时都会调用此方法。它从请求参数中读取报告名称、加载报告、配置报告并将其显示给用户。
c# .net report devexpress
1个回答
0
投票

处理报告后,我们将自动处理所有包含的图像。然而,当涉及 ASPxWebDocumentViewer 时,情况要复杂得多。网页的生命周期比预览的报表文档的生命周期短得多。由于我们不想在每次导出或在页面之间导航时重新创建整个文档,因此我们需要将其保存在某个地方。每次预览报告时(例如,通过刷新浏览器页面),您都会获得一份新的文档副本(除非您明确执行此操作,否则不会自动删除前一个文档副本)。这就是为什么您会看到内存使用量不断增加。这可能看起来像内存泄漏,但事实并非如此。此外,我们试图在缓存方面变得聪明:我们没有一个,而是两个存储(内存中和持久)。持久存储还用于在 Web Farm 环境中跨服务器共享文档。检查这些帮助主题,如果您有任何后续问题,请告诉我: 文档查看器生命周期 文档查看器缓存管理。

注意。如果您的文档(图像)非常大并且您希望直接控制报告的生命周期,我建议测试我们的 PdfStreamingExporter。该中介器是专门为大型报告创建的,其中页面一旦准备好就被写入。虽然此替代方案意味着不需要 ASPxWebDocumentViewer,但您仍然可以使用浏览器的内置 PDF 查看器来可视化结果。

问候, 雅罗斯拉夫 DevExpress 支持

© www.soinside.com 2019 - 2024. All rights reserved.