【问题标题】:How to run cleanup code after a call to Crystal Reports ExportToHttpResponse method?调用 Crystal Reports ExportToHttpResponse 方法后如何运行清理代码?
【发布时间】:2011-09-17 03:20:32
【问题描述】:

我们的 ASP.Net 应用程序出现问题,Crystal Reports 引擎在为用户生成报告后将垃圾 .tmp 文件留在服务器的 Temp 文件夹中。

所以我们试图弄清楚如何在 Report 对象上运行 .Close() 和 .Dispose() 方法,但我们发现在导出发生后代码永远不会运行。

MyReport.Report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, 
        this.Response, true, "My_Report");

MyReport.Report.Close();
MyReport.Report.Dispose();

在最后两行设置的断点永远不会被击中,我们还尝试将其他代码放在那里来测试处理过程。没有一个运行。 (我也在其他网站上看到过类似代码的这个问题,但没有答案)

我假设 ExportToHttpResponse 方法此时正在向用户返回一个文件流 (PDF),结束处理,因此其余代码不会运行。如果是这种情况,我们如何让 CR 对临时文件执行清理,而 Close() 和 Dispose() 方法应该这样做?我们是否必须实施手动事后清理?

【问题讨论】:

  • 希望您能得到答复。我们的一个供应商显然没有意识到这个问题,所以有一天当磁盘填满时,我们的网络服务器停止工作。我们现在只是运行一个计划任务来删除旧的临时文件。
  • 是的,没错。由于磁盘空间已满,我们的托管服务器崩溃了几次。现在托管团队每年手动清理文件几次。计划任务是我们考虑过的后备。

标签: asp.net crystal-reports


【解决方案1】:

我没有办法重现这个问题,所以我会说你可以使用 using 语句来指定何时释放对象。

What is the C# Using block and why should I use it? http://msdn.microsoft.com/en-us/library/yh598w02(VS.80).aspx

没有尝试过,但我认为你可以做类似的事情

using(MyReport m = new MyReport())
{
   m.Report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, 
        this.Response, true, "My_Report");
}

当我正在输入它时,我不确定它是否与您已经拥有的有很大不同,但是哦,好吧,这是可以尝试的。在我看来,这是可行的。 :)

希望对你有帮助。

【讨论】:

  • 谢谢。我们曾认为这是一种可能性,而且似乎可行。我们正在尝试的另一种方法是使用 Page_Unload。
【解决方案2】:

我实际上遇到了这个确切的问题,发现您可以通过将导出方法包含在 Try Catch 块中并将 Close() 和 Dispose() 方法放在 finally 中来强制运行 Close() 和 Dispose() 方法像这样:

            Try
            MyReport.Report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Page.Response, True, ReportName)
        Catch ex As System.Exception

        Finally

            MyReport.Report.Close()
            MyReport.Report.Dispose()

        End Try

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多