Sub*_*Dev 7 .net c# asp.net asp.net-mvc itextsharp
堆栈跟踪看起来像
[ObjectDisposedException:无法访问已关闭的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");
}
Run Code Online (Sandbox Code Playgroud)
我读过MemoryStream - 无法访问封闭的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;
}
}
Run Code Online (Sandbox Code Playgroud)
Pan*_*vos 12
退出操作方法后,流即关闭,或者更确切地说,using ( var ms = new MemoryStream() ) {块.
您不需要处理MemoryStream.返回的FileStreamResult对象File(ms, "application/pdf", "Test.pdf");将在渲染后处置它.实际发送流数据的代码是:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下块替换此块:
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;
}
Run Code Online (Sandbox Code Playgroud)
确保在发生错误时丢弃流.
UPDATE
正如Igor所提到的,并且正如源代码所示,FileStreamResult不会重置流位置.你必须在打电话之前将它设置为0return File(...)
班级PdfWriter可能会关闭您的直播。确保将该CloseStream属性设置为 false。
接下来,您不using应该在此处使用MemoryStream,因为FileStreamResult操作结果将在发送流后负责处理该流。现在,在发送发生之前,流实际上已关闭(通过处理)。
另外,在发送文件之前,您应该将流返回到位置 0。
您可以将整个部分包装在 a 中try...catch,以便在发生错误时处理流(但 GC 最终会处理它,MemoryStream如果管理不当,所以这不是强制性的)。
| 归档时间: |
|
| 查看次数: |
26577 次 |
| 最近记录: |