gpt4 book ai didi

c# - 为什么我在这里得到 "Cannot access a closed Stream"?

转载 作者:太空狗 更新时间:2023-10-29 20:04:20 29 4
gpt4 key购买 nike

堆栈跟踪看起来像

[ObjectDisposedException: Cannot access a closed Stream.]
System.IO.__Error.StreamIsClosed() +53
System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count) +11411219 System.Web.Mvc.FileStreamResult.WriteFile(HttpResponseBase response) +81 System.Web.Mvc.FileResult.ExecuteResult(ControllerContext context) +168
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13

调用之后

        //Byte[] bytes;
using ( var ms = new MemoryStream() )
{
using ( var doc = new Document() )
{
using ( var writer = PdfWriter.GetInstance(doc, ms) )
{

doc.Open();
//var example_html = @"<p>This <em>is </em><span class=""headline"" style=""text-decoration: underline;"">some</span> <strong>sample <em> text</em></strong><span style=""color: red;"">!!!</span></p>";
var example_html = System.IO.File.ReadAllText(Path.Combine(Server.MapPath("~/EmailTemplates"), "template.html"));
var example_css = @".headline{font-size:200%}";
using ( var srHtml = new StringReader(example_html) )
{
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
}
using ( var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css)) )
{
using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html)))
{
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss);
}
}


doc.Close();
}
}
//bytes = ms.ToArray();
return File(ms, "application/pdf", "Test.pdf");
}

我读过 MemoryStream - Cannot access a closed Stream ,但这不是同一种情况,因为我没有使用 StreamReader

编辑:仍然无法使用

    [OutputCache(NoStore = true, Duration = 0)]
public ActionResult Run()
{
Byte[] bytes;
var ms = new MemoryStream();
try
{
using (var doc = new Document())
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
writer.CloseStream = false;
doc.Open();
var example_html = @"<p>This <em>is </em><span class=""headline"" style=""text-decoration: underline;"">some</span> <strong>sample <em> text</em></strong><span style=""color: red;"">!!!</span></p>";
//var example_html = System.IO.File.ReadAllText(Path.Combine(Server.MapPath("~/EmailTemplates"), "LinkEmailTemplate.html"));
var example_css = @".headline{font-size:200%}";
using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css)))
{
using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html)))
{
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss);
}
}
doc.Close();
}
}
bytes = ms.ToArray();
ms.Position = 0;
return File(ms, "application/pdf", "Test.pdf");
}
catch
{
ms.Dispose();
throw;
}
}

最佳答案

一旦您退出操作方法,或者更确切地说,using ( var ms = new MemoryStream() ) { block ,流就会关闭。

您不需要处置 MemoryStream。 File(ms, "application/pdf", "Test.pdf"); 返回的 FileStreamResult 对象将 dispose it after rendering .实际发送流数据的代码是:

protected async override Task WriteFileAsync(HttpResponse response)
{
var outputStream = response.Body;

using (FileStream)
{
var bufferingFeature = response.HttpContext.Features.Get<IHttpBufferingFeature>();
bufferingFeature?.DisableResponseBuffering();

await FileStream.CopyToAsync(outputStream, BufferSize);
}
}

您可以将此 using block 替换为:

var ms = new MemoryStream();
try
{
//..
//From Igor's comment. FileStreamResult won't reset the stream position itself
ms.Position=0;
return File(ms, "application/pdf", "Test.pdf");
}
catch
{
ms.Dispose();
throw;
}

确保在发生错误时处理流。

更新

正如 Igor 所提到的,并且如源代码所示,FileStreamResult 不会重置流位置。在调用 return File(...)

之前,您必须将其设置为 0

关于c# - 为什么我在这里得到 "Cannot access a closed Stream"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36184509/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com