水晶报表中的线程被中止异常

5

我们在将报告导出为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();

请帮我解决这个异常。

3个回答

6

SAP解释说:

原因

问题已经被识别并记录在问题报告IDADAPT00765364下。 该错误可能是由于ExportToHttpResponse()方法中使用了Response.End()引起的。
众所周知,Reponse.End()会导致线程中止。这是设计上的问题。
有关更多信息,请参见Microsoft KB312629文章

解决方法

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

分辨率

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

将Crystal报告导出为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;
}

为了将名称添加到文件中,您可以使用 Response.AddHeader("content-disposition", "attachment; filename=Report " + DateTime.Now.ToString() + ".pdf"); 而不是 **Response.ClearHeaders();**。 - user9737100

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
          {
            //some other code her
    repDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "Some title ");
          }
          Catch
          {
          }
        }

    private void some_Command(object source, CommandEventArgs e)
    {
      try
      {
        //some other code here
      }
      catch
      {
      }
      repDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "Some title ");
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接