Pergunta

Eu tenho seguinte código para download de arquivos:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

Quando eu executá-lo no meu IIS6 local, ele funciona bem. browser (testado no IE8, Firefox 3.5.2, o Opera 10) mostra o comprimento da lima antes de eu começar a baixar o arquivo.

Quando eu executar esse código no IIS7 remoto, navegador web não mostra tamanho do arquivo. tamanho do arquivo é desconhecido.

Por que eu não entendo tamanho do arquivo quando esse código é executado sob IIS7?

Foi útil?

Solução

Use Fiddler para verificar o que realmente é enviado. Meu palpite é que você está sendo fragmentada codificação como resultado de buffer a ser definida como falsa no servidor IIS7.

BTW, soltar o Response.End chamar seu uma coisa muito traumática para fazer e é desnecessário (para que o assunto assim é a chamada para Clear).

Editar

Estritamente falando ao transmitir conteúdo com codificação fragmentada (o que é desejável em seu cenário) o cabeçalho Content-Length não deve estar presente (ver Seção RFC2616 4,4 .) parece-me que IIS7 se encarrega de fazer cumprir isso. Na verdade eu tive um cenário Classic-ASP no qual IIS7 lança um erro quando tenta código COM para adicionar um cabeçalho Content-Length quando o buffer está desligado.

Este é realmente chato, porque apesar do que o comitê nas torres de marfim gostaria, este cabeçalho dar ao usuário final uma peça muito útil de informações.

Outras dicas

Obrigado por este post .... Eu tenho que trabalhar para o IE com a primeira linha.

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top