【问题标题】:Disposable: MemoryStream.Capacity threw an exception of System.ObjectDisposedException when generating PDF fileDisposable:MemoryStream.Capacity 在生成 PDF 文件时抛出 System.ObjectDisposedException 异常
【发布时间】: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


【解决方案1】:

也许编译器没有正确地将 using 块括起来。如果您明确地将 using 语句括起来,您会看到同样的问题吗?

编辑:由于缺少代表,无法作为评论发表:(。

【讨论】:

  • 这应该是一个评论而不是一个答案.. 删除它,让自己免于潜在的反对票..!
  • 我还没有 50 个代表。无法评论。
【解决方案2】:

问题是,您在移动到位置 = 0 之前确实刷新了流。尝试不刷新,只需注释掉 printWriter.Flush()

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2017-05-17
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多