Почему выход из цикла foreach вызывает жалобу "Не удается получить доступ к закрытому потоку"?
Основываясь на предложении в комментариях здесь, я реорганизовал свой метод, чтобы попытаться назначить данные для MemoryStream за пределами iTextSharp.text.Document "using" (но внутри предложения MemoryStream using):
internal static HttpResponseMessage GeneratePDFOfReportFutures()
{
HttpResponseMessage result = null;
futureReports = GetAllFutureReports();
try
{
using (var ms = new MemoryStream())
{
using (var doc = new Document(PageSize.A4.Rotate(), 25, 25, 25, 25)) // the "Rotate" makes it landscape orientation
{
using (PdfWriter.GetInstance(doc, ms))
{
doc.Open();
. . .
// "int i" is for testing a quick exit of this long-running loop
int i = 0;
foreach (QueuedReports qr in futureReports)
{
var tblRow = new PdfPTable(6)
{
WidthPercentage = 80,
SpacingBefore = 4f
};
float[] tblRowWidths = new float[] { 220f, 180f, 220f, 160f, 160f, 340f };
tblRow.SetWidths(tblRowWidths);
tblRow.HorizontalAlignment = Element.ALIGN_LEFT;
var phraseRptName = new Phrase(qr.ReportName, helvetica9);
var cellRptName = GetCellForBorderedTable(phraseRptName, Element.ALIGN_CENTER, BaseColor.WHITE);
cellRptName.VerticalAlignment = Element.ALIGN_MIDDLE;
tblRow.AddCell(cellRptName);
. . .
tblRow.AddCell(cellRecipients);
doc.Add(tblRow);
i++;
if (i >= 12)
{
break;
}
} // foreach
} // pdfWriter
} // doc
var bytes = ms.ToArray();
result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(bytes)
};
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = string.Format("{0}.pdf", "test")
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
} // memoryStream
} // try
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return result;
} // GeneratePDFOfReportFutures
С точкой останова в строке "break", I шаг (F10) и следующее исключение перехватывается до достижения назначения байтам:
Исключение System.ObjectDisposedException HResult=-2146232798
Сообщение = Невозможно получить доступ к закрытому потоку. Источник = mscorlib
ObjectName = "" StackTrace: в System.IO.__Error.StreamIsClosed() в System.IO. MemoryStream.Write (буфер Byte[], смещение Int32, число Int32) в iTextSharp.text.pdf.OutputStreamCounter.Write(буфер Byte[], смещение Int32, число Int32) в iTextSharp.text.pdf.PdfIndirectObject.WriteTo(поток os)) на iTextSharp.text.pdf. PdfWriter.PdfBody.Write (непрямой PdfIndirectObject, refNumber Int32, поколение Int32) в iTextSharp.text.pdf.PdfWriter.PdfBody.Add(объект PdfObject, refNumber Int32, поколение Int32, логическое inObjStm) в файле PDFText..Add (PdfObject objecta, PdfIndirectReference refa, Boolean inObjStm) в iTextSharp.text.pdf.PdfWriter.PdfBody.Add(PdfObject objecta, PdfIndirectReference refa) в iTextSharp.text.pDIEFDEFTIFTBERT.Text.PDF.pdf.PdfWriter.Close() в iTextSharp.text.DocWriter.Dispose()
Поскольку доступ к PdfWriter и / или Doc, по-видимому, вызывает проблему, может показаться, что мне нужно переместить код написания не только с использованием документа, но и с использованием pdfWriter, поэтому я сделал это, перемещая код следующим образом:
. . .
} // foreach
var bytes = ms.ToArray();
result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(bytes)
};
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = string.Format("{0}.pdf", "test")
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
} // pdfWriter
} // doc
} // memoryStream
} // try
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return result;
... но я все еще получаю точно такое же исключение. Однако между тем, что я сейчас вижу, и тем, что описано в последнем посте, есть разница в том, что исключение не выдается, пока я не F10 на этой строке:
} // pdfWriter
Если я переместу обратную строку выше (и все еще держу ее ниже блока catch), примерно так:
return result;
} // pdfWriter
... исключение выдается на F10ing в строке "возвращаемый результат".
Почему это терпит неудачу, и как я могу предотвратить это?