水晶报告中线程被中止异常

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

将报告导出为 PDF 时,我们收到线程正在中止异常。

我们使用以下代码将报告导出为 PDF。

                    Response.Buffer = true;
                    Response.ClearContent();
                    Response.ClearHeaders();
                    Response.ContentType = "application/pdf";
                    myReportDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, Session["ReportName"].ToString());
                    Response.Flush();
                    Response.Close();

请帮助我如何解决此异常。

crystal-reports report
3个回答
6
投票

SAP 解释说:

原因

问题已被识别并记录在问题报告 ID

ADAPT00765364
下。 该错误可能是因为
Response.End()
ExportToHttpResponse()
方法内部使用而引起的。
Reponse.End()
导致线程中止是一个已知问题。这是设计使然。
请参阅Microsoft KB312629 文章了解更多信息。

解决方法

....
 try
   {
   reportDocument.ExportToHttpResponse(format, Response, true, Page.Title);
   }
 catch (System.Threading.ThreadAbortException)
   {
   }
....

分辨率

您可以编写自己的代码,将 Crystal Report 以 PDF、Word、Excel 等格式直接导出到浏览器。您必须确保使用适当的内容类型。

将 Crystal Report 以 PDF 格式导出到 Web 浏览器的示例代码

try
{
 boReportDocument.Load(Server.MapPath(@"MyReport.rpt"));
 System.IO.Stream oStream = null;
 byte[] byteArray = null;
 oStream = boReportDocument.ExportToStream (ExportFormatType.PortableDocFormat);
 byteArray = new byte[oStream.Length];
 oStream.Read(byteArray, 0, Convert.ToInt32(oStream.Length - 1));
 Response.ClearContent();
 Response.ClearHeaders();
 Response.ContentType = "application/pdf";
 Response.BinaryWrite(byteArray);
 Response.Flush();
 Response.Close();
 boReportDocument.Close();
 boReportDocument.Dispose();

}
catch (Exception ex)
{
 string s = ex.Message;
}

0
投票

抛出错误是因为在 ExportToHttpResponse 内部调用了response.End()。删除对 Flush 和 Close 响应的调用,并将对 ExportToHttpResponse 的调用包装在 try/catch 块内以捕获并忽略 System.Threading.ThreadAbortException。


0
投票

该错误是由于 ExportToHttpResponse 内部进行的 response.End() 导致的。 由于您的代码可能调用 ExportToHttpResponse 然后执行其他一些操作,因此会引发线程中止异常。 因此,请避免在调用 ExportToHttpResponse 之后添加任何代码行。即使使用 try-catch 包装,也会引发中止异常。

因此请确保事件方法中的最后一行包含 ExportToHttpResponse。

出发
private void some_Command(object source, CommandEventArgs e)
{
  try
  {
    repDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "Some title ");
  }
  Catch
  {
  }
}

private void some_Command(object source, CommandEventArgs e)
{
  try
  {
  }
  catch
  {
  }
  repDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "Some title ");
}
© www.soinside.com 2019 - 2024. All rights reserved.