trace de la pile ressemblePourquoi est-ce que je reçois "Impossible d'accéder à un flux fermé" ici?
[ObjectDisposedException: Impossible d'accéder à un flux fermé.]
System.IO .__ Error.StreamIsClosed() +53
System.IO.MemoryStream.Read (tampon octet [], int32 offset, compte int32) 11411219 System.Web.Mvc.FileStreamResult.WriteFile (réponse HttpResponseBase) 81 System.Web.Mvc.FileResult.ExecuteResult (contexte ControllerContext) 168
de System.Web.Mvc.ControllerActionInvoker. InvokeActionResult (ControllerContext controllerContext, ActionResult actionResult) +13
après avoir invoqué
//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");
}
J'ai lu MemoryStream - Cannot access a closed Stream, mais ce n'est pas le même scénario parce que je ne suis pas en utilisant StreamReader
Edit: ne fonctionne toujours pas avec
[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;
}
}
Parce que le flux a été fermé dès que vous avez quitté la méthode d'action. Lorsque la vue a essayé d'y accéder, elle a trouvé qu'elle était déjà fermée. –
'Ne fonctionne toujours pas' - ne définit pas 'ne fonctionne pas'. Aussi vous avez une variable nommée 'bytes' qui ne fait rien mais je suis curieux de savoir s'il y a quoi que ce soit dans ce tableau avant que votre méthode ne se termine. – Igor
* Pourquoi * copiez-vous le contenu du flux dans un tableau d'octets? Si vous faites cela, il n'y a pas de raison de retourner le * stream * avec 'File (..)', juste retourner le tableau d'octets par exemple 'File (bytes ...)' –