【发布时间】:2015-11-25 16:09:11
【问题描述】:
我在生成 PDF 文件时使用Disposable pattern。
使用如下代码:
public partial class WriteNotes : System.Web.UI.Page
{
...
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
...
using (System.IO.MemoryStream printStream = new System.IO.MemoryStream())
using (System.IO.StreamWriter printStreamWriter = new System.IO.StreamWriter(printStream))
using (System.Web.UI.HtmlTextWriter printWriter = new System.Web.UI.HtmlTextWriter(printStreamWriter))
{
base.Render(printWriter);
printWriter.Flush();
using (System.IO.StreamReader myStreamReader = new System.IO.StreamReader(printStream))
{
myStreamReader.BaseStream.Position = 0;
Document pdfDocument = pdfConverter.GetPdfDocumentObjectFromHtmlStream(myStreamReader.BaseStream, System.Text.Encoding.Default, HttpContext.Current.Request.Url.ToString().Replace(HttpContext.Current.Request.Url.PathAndQuery, "/"));
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/pdf";
pdfDocument.Save(HttpContext.Current.Response.OutputStream);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
}
}
...
}
执行后:
Document pdfDocument = pdfConverter.GetPdfDocumentObjectFromHtmlStream(myStreamReader.BaseStream, System.Text.Encoding.Default,HttpContext.Current.Request.Url.ToString().Replace(HttpContext.Current.Request.Url.PathAndQuery, "/"));
查看 MemoryStream 的属性时,我观察到以下内容:
Capacity: 'printStream.Capacity' threw an exception of type 'System.ObjectDisposedException'
Length: 'printStream.Length' threw an exception of type 'System.ObjectDisposedException'
Position: 'printStream.Position' threw an exception of type 'System.ObjectDisposedException'
代码可能有什么问题?
【问题讨论】:
-
如果您在调试器窗口之一(watch、auto、locals)中查看这些属性,它们有时可能无法评估。这并不一定意味着代码有问题。
-
您何时将 Content.Type 添加到 Response.Header
Response.AddHeader -
我已经把你建议的代码行
printStream.Seek(0, SeekOrigin.Begin)放在printWriter.Flush()之后和using (System.IO.StreamReader myStreamReader = new System.IO.StreamReader(printStream))之前,但是,我仍然有同样的问题 -
@StingyJack 并不重要。即使我不使用
Disposable,它也会给出同样的错误。不知道怎么回事 -
它与是否使用 IDisposable 无关。调试器不能总是显示可靠的信息,这在检查对象时尤其成问题。
标签: c# idisposable streamwriter memorystream htmltextwriter