2012-05-02 2 views
29

Следующий код работает, но мне интересно, правильно ли закрыт MemoryStream. Как это должно быть выполнено или FileStreamResult обрабатывать его для меня?С FileStreamResult, как закрывается MemoryStream?

public FileStreamResult DownloadBudgetedRoleOpportunities(
    Guid projectGuid, 
    IEnumerable<Guid> guidRequiredRoles) 
{ 
    var rolebroker = new ProjectRoleBudgetBroker(); 
    var memstream = rolebroker.CreateBudgetedRoleOpportunies(
     projectGuid, 
     guidRequiredRoles); 

    var fsr = new FileStreamResult (memstream, "application/csv") 
       { 
       FileDownloadName = "RoleOpportunities.csv" 
       }; 
    // memstream.Close(); throws exception 
    return fsr; 
} 

ответ

37

FileStreamResult сделает это за вас. Когда вы сомневаетесь, всегда проверяйте код, потому что код никогда не лежит, и поскольку ASP.NET MVC является открытым исходным кодом, еще проще просмотреть код.

Быстрый поиск в Google для FileStreamResult.cs позволяет проверить, что в методе WriteFile поток правильно размещен с использованием инструкции using. (Не каламбур)

protected override void WriteFile(HttpResponseBase response) { 
    // grab chunks of data and write to the output stream 
    Stream outputStream = response.OutputStream; 
    using (FileStream) { 
     byte[] buffer = new byte[_bufferSize]; 

     while (true) { 
      int bytesRead = FileStream.Read(buffer, 0, _bufferSize); 
      if (bytesRead == 0) { 
       // no more data 
       break; 
      } 

      outputStream.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
2

У вас есть доступ к исходному коду, так что вы можете проверить себя ;-)

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