2012-05-02 23 views
29

Aşağıdaki kod çalışıyor, ancak MemoryStream oluşturulmasının düzgün şekilde kapatılıp kapatılmadığını merak ediyorum. Bu nasıl yapılır veya FileStreamResult benim için nasıl ele alınır?FileStreamResult ile, MemoryStream nasıl kapatılır?

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; 
} 

cevap

37

FileStreamResult bunu sizin için yapacaktır. Şüpheye düştüğünüzde, her zaman kodu kontrol edin, çünkü kod asla yalan söylemez ve ASP.NET MVC açık kaynak olduğundan kodu görüntülemek daha da kolaydır.

FileStreamResult.cs için Google'da yapılan hızlı bir arama, WriteFile yönteminde akışın using ifadesiyle doğru şekilde doğrulandığını doğrulamanıza olanak sağlar. (Hayır cinas tasarlamak)

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

Sen kaynak koduna erişim var, bu yüzden kendini kontrol edebilir ;-)

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; 
    } 
    } 
} 
İlgili konular