Как я располагаю свой filestream при реализации загрузки файла в ASP.NET?

У меня есть класс DocumentGenerator который переносит a MemoryStream. Таким образом, я реализовал IDisposable на классе.

Я не вижу, как/где я могу возможно расположить его все же.

Это - мой текущий код, который выполняет загрузку файла в MVC:

using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
    /* some document manipulation with the 
       DocumentGenerator goes here ...*/

    return File(dg.GetDocumentStream(), "text/plain", filename);
}

Это ошибки как поток закрыты/расположены перед контроллером, закончилось с ним. Как я могу удостовериться, что мои ресурсы правильно расположены в этой ситуации?

Править: Моя реализация IDisposable в данный момент просто располагает MemoryStream. Я знаю, что это не надлежащая реализация, я просто использовал его в качестве теста. Есть ли что-то другое, что я мог сделать здесь, чтобы заставить его работать?

public void Dispose()
{
    _ms.Dispose();
    _ms = null;
}
21
задан fearofawhackplanet 21 June 2010 в 12:05
поделиться

2 ответа

Вам не нужно удалять поток. Он будет удален методом FileStreamResult.WriteFile . Отрывок кода из этого класса:

public FileStreamResult(Stream fileStream, string contentType) : base(contentType)
{
    if (fileStream == null)
    {
        throw new ArgumentNullException("fileStream");
    }
    this.FileStream = fileStream;
}

protected override void WriteFile(HttpResponseBase response)
{
    Stream outputStream = response.OutputStream;
    using (this.FileStream)
    {
        byte[] buffer = new byte[0x1000];
        while (true)
        {
            int count = this.FileStream.Read(buffer, 0, 0x1000);
            if (count == 0)
            {
                return;
            }
            outputStream.Write(buffer, 0, count);
        }
    }
}

Обратите внимание на с использованием . Когда вы вызываете File (dg.GetDocumentStream (), "text / plain", filename) из вашего контроллера, это вызывает конструктор, который сохраняет поток в общедоступное свойство, которое удаляется во время рендеринга.

Заключение: вам не нужно беспокоиться об удалении получения потока с помощью dg.GetDocumentStream () .

32
ответ дан 29 November 2019 в 21:17
поделиться

Чтобы добавить к тому, что сказал Дарин , важно отметить эту концепцию:

public Stream GetDownloadFile(...)
{
  using (var stream = new MemoryStream()) {
    return stream;
  }
}

public Stream GetDownloadFile(...)
{
  using (var generator = DocumentGenerator.OpenTemplate(path))
  {
    // Document manipulation.

    return File(generator.GetDocumentStream(), "text/plain", filename);
  }
}

Независимо от того, как вы используете его в своем методе, блок using гарантирует, что Dispose всегда вызывается, это важно, если вы решите использовать результат блока using в качестве оператора возврата, это не помешает его удалению ....

0
ответ дан 29 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: