【发布时间】:2016-07-11 02:50:04
【问题描述】:
堆栈跟踪看起来像
[ObjectDisposedException:无法访问已关闭的流。]
System.IO.__Error.StreamIsClosed() +53
System.IO.MemoryStream.Read(字节 [] 缓冲区,Int32 偏移量,Int32 计数) +11411219 System.Web.Mvc.FileStreamResult.WriteFile(HttpResponseBase 响应) +81 System.Web.Mvc.FileResult.ExecuteResult(ControllerContext 上下文) +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;
}
}
【问题讨论】:
-
因为一旦您退出操作方法,流就被关闭了。当视图试图访问它时,它发现它已经被关闭了。
-
Still not working with- 定义not working。此外,您还有一个名为bytes的变量,它不执行任何操作,但我很好奇在您的方法退出之前此数组中是否有任何内容。 -
为什么将流内容复制到字节数组中?如果您这样做,则没有理由返回带有
File(..)的流,只需返回字节数组,例如File(bytes...)
标签: c# asp.net .net asp.net-mvc itextsharp