Как вернуть поток из вида MVC? - PullRequest
0 голосов
/ 29 декабря 2011

Полагаю, я довольно близок, но мой поток либо нулевой, либо удален.Вот пример кода.

var ms = new MemoryStream();
using (var sw = new StreamWriter(ms))
{
   using (var tw = new HtmlTextWriter(sw))
   {
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null);
    ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
    viewResult.View.Render(viewContext, tw);
    ms.Position = 0;
    return ms;
    }
}

вызывающий код приводит к исключению objectDisposedException, поскольку поток удаляется.Если я переместить возврат за пределы использования, результат будет нулевым.Что я здесь не так делаю?Любые идеи, как я могу это правильно работать?

Ответы [ 3 ]

2 голосов
/ 29 декабря 2011

Оператор using для StreamWriter также закроет основной поток.Удалите оператор using в StreamWriter, чтобы сохранить поток живым.
Другой вариант - вернуть массив байтов, а не поток памяти.

return ms.ToArray();
0 голосов
/ 29 декабря 2011

У вас есть 2 использования, которые он говорит, поместите возврат внутрь ауттера, используя ()

как это

var ms = new MemoryStream();
using (var sw = new StreamWriter(ms))
{
   using (var tw = new HtmlTextWriter(sw))
   {
    ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null);
    ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
    viewResult.View.Render(viewContext, tw);
    ms.Position = 0;
    }
  return ms;
}
0 голосов
/ 29 декабря 2011

Чтобы использовать класс в блоке using, этот класс должен реализовывать IDisposable.Когда блок заканчивается, он вызывает IDisposable.Dispose(), который удаляет ваш поток.Это хорошая практика, но если вам нужен поток, либо удалите using, либо поместите в него возврат.Я бы пошел со вторым вариантом.

...