2012-05-02 22 views
29

Đoạn mã sau hoạt động, nhưng tôi tự hỏi nếu đã tạo MemoryStream được đóng đúng cách chưa. Làm thế nào điều này nên được thực hiện hoặc không FileStreamResult xử lý nó cho tôi?Với FileStreamResult, MemoryStream đã đóng như thế nào?

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

Trả lời

37

FileStreamResult sẽ làm điều đó cho bạn. Khi nghi ngờ luôn luôn kiểm tra mã, bởi vì mã không bao giờ nằm ​​và kể từ khi ASP.NET MVC là mã nguồn mở nó thậm chí còn dễ dàng hơn để xem mã.

Tìm kiếm nhanh trên Google cho FileStreamResult.cs cho phép bạn xác minh rằng trong phương thức WriteFile luồng được xử lý chính xác bằng cách sử dụng câu lệnh using. (Không có ý định chơi chữ)

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

Bạn có quyền truy cập vào mã nguồn, vì vậy bạn có thể kiểm tra bản thân ;-)

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; 
    } 
    } 
} 
Các vấn đề liên quan