asp.net-mvc - world - text box asp net mvc




Qual é a diferença entre os quatro resultados de arquivo no asp.net MVC (2)

Ótima pergunta ... e merece mais detalhes. Eu me encontro aqui como resultado de uma situação interessante. Nós estávamos entregando alguns anexos pdf através do ambiente MVC3 / C #. Nosso código foi lançado e começamos a receber algumas respostas de nossos clientes de que os downloads estavam se comportando de forma estranha quando eles estavam usando o Chrome e o tipo de arquivo estava sendo convertido para 'pdf-, attachment.pdf-, attachment'. Sim ... você entendeu ... a coisa toda. Então, alguém poderia reescrevê-lo para ser apenas 'pdf' e o arquivo ainda salvaria intacto, mas que bagunça!

Então, para descrever a situação inicial, estávamos configurando o cabeçalho 'Content-Disposition' e retornando um FileContentResult ...

var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = result.Attachment.FileName,
                Inline = false
            };
            Response.AppendHeader("Content-Disposition", cd.ToString());

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

Parecia bom. Funcionou bem no IE. Então fiz algumas pesquisas e tentei implementar o FileStreamResult (mantendo o setter Content-Disposition):

MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

Corrigido o problema no Chrome! Hmmm ... mas por que diabos eu tenho que pegar meu array de bytes perfeitamente bom e fazer stream dele e então retorná-lo via isso para que o nome do arquivo funcione corretamente?

Então veio o violinista.

Com FileContentResult, eu tenho 2 Content-Disposições no cabeçalho. Com o FileStreamResult, recebi 1.

FileContentResult acrescenta um cabeçalho Content-Disposition ao fornecer o nome do arquivo, e o Chrome considera múltiplos desse cabeçalho como um erro.

Reação estranha ... mas definitivamente uma que é bom saber.

O ASP.NET tem quatro tipos diferentes de resultados de arquivos:

  • FileContentResult: envia o conteúdo de um arquivo binário para a resposta.
  • FilePathResult: envia o conteúdo de um arquivo para a resposta
  • FileResult: Retorna a saída binária para gravar na resposta
  • FileStreamResult: envia conteúdo binário para a resposta usando uma instância de fluxo

Essas descrições são obtidas do MSDN e, com a exceção do FileStreamResult, os três primeiros sons são idênticos. Então, qual é a diferença entre eles?


FileResult é uma classe base abstrata para todos os outros.

  • FileContentResult - você usa quando você tem uma matriz de bytes que você gostaria de retornar como um arquivo
  • FilePathResult - quando você tem um arquivo no disco e gostaria de retornar seu conteúdo (você dá um caminho)
  • FileStreamResult - você tem um fluxo aberto, você quer retornar seu conteúdo como um arquivo

No entanto, você raramente terá que usar essas classes - você pode usar apenas uma das sobrecargas Controller.File e deixar a ASP.NET MVC fazer a mágica para você.







resulttype