33

MemoryStream次のコードは機能しますが、作成されたものが適切に閉じられているかどうか疑問に思っています。これはどのように実行する必要がありFileStreamResultますか、それとも私のために処理しますか?

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

2 に答える 2

42

はあなたの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);
        }
    }
}
于 2012-05-03T10:53:11.563 に答える
3

あなたはソースコードにアクセスできるので、自分でチェックすることができます;-)

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;
    }
  }
}
于 2012-05-03T10:54:28.207 に答える