Pergunta

Estou streaming de um PDF para o navegador em ASP.NET 2.0. Isso funciona em todos os navegadores mais de HTTP e todos os navegadores Except IE através de HTTPS. Tanto quanto eu sei, este utilizado para o trabalho (nos últimos 5 anos ou mais) em todas as versões do IE, mas os nossos clientes só recentemente começou a problemas de relatório. Eu suspeito que o Não salvar páginas criptografadas no disco opção de segurança usada para ser desativado por padrão e em algum momento se tornou habilitada por padrão (Opções da Internet -> Avançado -> Segurança). Se desligar esta opção ajuda, como uma forma de contornar, mas não é viável como uma solução a longo prazo.

A mensagem de erro que eu estou recebendo é:

O Internet Explorer não pode baixar OutputReport.aspx de www.sitename.com.

O Internet Explorer não conseguiu abrir este site da Internet. O site solicitado não está disponível ou não pode ser encontrada. Por favor, tente novamente mais tarde.

A ferramenta utilizada para criar o PDF é ActiveReports de DataDynamics . Uma vez que o PDF é criado, aqui está o código para enviá-lo para baixo:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()  

Nota: Se eu não especificar explicitamente cache-controle, então .NET envia no-cache em meu nome, então eu tentei definindo cache-controle para: privado ou público ou maxage = #, mas nenhum deles parece trabalho.

Aqui está a diferença: quando eu corro Fiddler para inspecionar os cabeçalhos de resposta, tudo funciona bem. Os cabeçalhos que recebo são:

HTTP / 1.1 200 OK
Cache-Control: max-age = 1 | Data: Wed, 29 de julho de 2009 17:57:58 GMT
Content-Type: application / pdf
Servidor: Microsoft-IIS / 6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
X-ASPNet-Versão: 2.0.50727
Content-Disposition: anexo; filename = statement.pdf
Content-Encoding: gzip
Vary: Accept-Encoding
Transfer-Encoding: blocos

Assim que eu virar Fiddler off e tente novamente, ele falhar novamente. Uma outra coisa que eu notei é que quando Fiddler está funcionando eu recebo um Há um problema com o certificado de segurança do site mensagem de aviso, e eu tenho que clique em Continuar neste site (não recomendado) para passar. Quando Fiddler está desligado, eu não encontrar esse aviso de segurança e falha imediatamente.

Estou curioso o que está acontecendo entre Fiddler eo navegador para que ele funcione quando Fiddler está em execução, mas pausas quando não é, mas o mais importante, alguém tem alguma idéia de como eu poderia mudar meu código até streaming de PDFs para IE irá funcionar sem fazer alterações para a máquina cliente?

Update: questões O Fiddler são resolvidos, muito obrigado EricLaw, então agora ele se comporta de forma consistente (quebrado, com ou sem Fiddler execução)

.

Com base no Google busca, parece haver uma abundância de relatos de esse mesmo problema em toda a web, cada um com a sua própria combinação específica de cabeçalhos de resposta que parecem corrigir o problema para seus casos individuais. Eu tentei muitas destas sugestões, incluindo a adição de um ETag, data LastModified, removendo o cabeçalho (usando Fiddler) e dezenas de combinações de cabeçalhos Pragma Cache-Control e / ou Vary. Eu tentei "Content-Transfer-Encoding: binário", bem como "application / força-download" para o ContentType. Nada ajudou até agora. Há uma poucos Microsoft KB artigos , os quais indicam que cache-Control: no-cache é o culpado. Quaisquer outras ideias?

Update:. A propósito, para ser completo, esse mesmo problema ocorre com saídas Excel e Word, bem

Update: Nenhum progresso foi feito. I enviado o arquivo .SAZ de Fiddler para EricLaw e ele foi capaz de reproduzir o problema quando a depuração IE, mas não há soluções ainda. Recompensa vai expirar ...

Foi útil?

Solução 2

Depois de duas semanas em um ganso selvagem, eu não tenho sido capaz de encontrar qualquer combinação de alterações de código que permitirá que este método de streaming de documentos PDF, Excel ou Word quando o ' Não salvar páginas para o disco criptografado opção' está ligado.

A Microsoft disse que esse comportamento é por design em uma série de artigos KB e e-mails privados. Parece que quando o ' Não salvar páginas criptografadas no disco ' opção é ativada que o IE está se comportando corretamente e fazer o que é dito para fazer. Este post é o melhor recurso que eu encontrei até agora que explica por que esta definição será ativada e os prós e contras de permitindo-:

"O ' Não salvar páginas criptografadas no disco ' entra em jogo quando se lida com SSL (HTTPS). Assim como um servidor web pode enviar informações feito sobre como armazenar em cache um arquivo de uma lata basicamente definir o Internet Explorer para cima para não salvar arquivos no cache durante uma SSL (HTTPS), independentemente se o servidor web aconselha que puder.

O que é a cabeça para transformar este recurso, a segurança é a razão número porque o recurso está ativado. Páginas não são armazenados no cache Temporary Internet Files.

Qual é a desvantagem? desempenho lento, uma vez que nada é guardado para o cache, mesmo que a imagem gif 1 byte usado uma dúzia de vezes na página deve ser buscada a partir do servidor de cada vez. Para piorar algumas ações do usuário pode falhar, como arquivos baixados serão excluídos e um erro apresentado ou abrir documentos PDF deixará de citar alguns cenários ".

A melhor solução que podemos encontrar neste momento é para se comunicar com nossos clientes e usuários que existem alternativas para usar essa configuração:

"Use 'Esvaziar pasta Temporary Internet Files quando o navegador é fechado'. Cada vez que o navegador fecha todos os arquivos serão eliminados da cache assumindo que não há um bloqueio em um arquivo de outro instância do navegador ou algum aplicativo externo.

Um monte de consideração deve ser dada antes de utilizar ' Não salvar páginas criptografadas no disco '. Soa como um grande recurso de segurança e que é, mas os resultados de usar esse recurso pode causar sua ajuda chamadas ao suporte para subir para falhas de download ou desempenho lento. "

Outras dicas

O Cache-Control cabeçalho está incorreto. Deve ser Cache-Control: max-age = 1 com o traço no meio. Tente fixar este primeiro para ver se ele faz a diferença.

Normalmente, eu diria que o mais provável culpado é o seu cabeçalho Vary, como tal, cabeçalhos, muitas vezes causa problemas com o cache no IE: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx . Você pode querer tentar adicionar um ETAG para os cabeçalhos de resposta.

Fiddler não deve ter nenhum impacto sobre cacheability (a menos que você tenha escrito regras), e parece que você está dizendo que ele faz, o que sugere que talvez haja um problema de tempo de algum tipo.

> Não salvar páginas criptografadas opção de segurança em disco usado para estar desativado por padrão

Esta opção é ainda desativada por padrão (no IE6, 7 e 8), embora os administradores de TI podem ligá-lo através de política de grupo e algumas grandes empresas fazê-lo.

A propósito, a razão de você ver o erro de certificado durante a execução Fiddler é que você não optou por confiar no certificado raiz Fiddler; consulte http://www.fiddler2.com/fiddler/help/httpsdecryption.asp para saber mais sobre este tema.

Eu tive um problema semelhante com arquivos PDF que eu queria transmitir. Mesmo com Response.ClearHeaders() vi Pragma e Cache-Control cabeçalhos adicionados no tempo de execução. A solução foi limpar os cabeçalhos no IIS (botão direito do mouse -> Propriedades no carregamento da página do PDF, em seguida, "cabeçalhos HTTP" tab).

Eu achei que este parecia estar a trabalhar para mim:

Dim browser As System.Web.HttpBrowserCapabilities = Request.Browser
If (browser.Browser = "IE") Then
  Response.AppendHeader("cache-control", "private") ' ie only
Else
  Response.AppendHeader("cache-control", "no-cache") ' all others (FF/Chrome tested)
End If

RESOLVIDO: Este é um problema de IE, e não de aplicação ... corrigi-lo com esta: http://support.microsoft.com/kb/323308 Ele funciona perfeito para mim, depois de tentar por um longo tempo.

ATT: Mr.Dark

Temos enfrentado um problema semelhante há muito tempo atrás - o que fizemos foi que (este é Java EE). Na configuração de aplicações web somarmos

<mime-mapping>
    <extension>PDF</extension>
    <mime-type>application/octet-stream</mime-type>
</mime-mapping>

Isso fará com que qualquer pdf vindo de sua aplicação web para ser baixado em vez do navegador tentando processar.

Editar : Parece que você está fluindo ele. Nesse caso, você vai usar um mime-type como application / octet-stream em seu código e não no config. Então, aqui em vez de

Response.ContentType = "application/pdf"

você usará

Response.ContentType = "application/octet-stream"

Qual versão do IE? Lembro-me que a Microsoft lançou uma correcção para o IE6 para este problema. Esperança de que é de alguma utilidade?

Eu li do seu Cache-control perseguição de ganso, mas eu vou compartilhar meu, que se reuniu as minhas necessidades , no caso de ajuda.

tentar desativar a compressão gzip.

Adicionando-lo aqui esperando que alguém pode encontrar este útil, em vez de ir através dos links.

Aqui está o meu código

    byte[] bytes = // get byte array from DB

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.Buffer = true;

    // Prevent this page from being cached.
    //  NOTE: we cannot use the CacheControl property, or set the PRAGMA header value due to a flaw re: PDF/SSL/IE
    Response.Expires = -1; 

    Response.ContentType = "application/pdf";
    // Specify the number of bytes to be sent
    Response.AppendHeader("content-length", bytes.Length.ToString());

    Response.BinaryWrite(bytes);    

            // Wrap Up
    Response.Flush();
    Response.Close();
    Response.End();

Como o OP eu estava coçando a cabeça por dias tentando chegar a este trabalho, mas eu fiz isso no final, então eu pensei que eu iria partilhar a minha 'combinação' de cabeçalhos:

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

A esperança que salva alguém em algum lugar um pouco de dor!

Eu estava correndo em um problema semelhante com a tentativa de transmitir um PDF através de SSL e colocar isso dentro de um iframe ou objeto. Eu estava achando que a minha página aspx iria manter o redirecionamento para a versão não segura do URL, e o navegador iria bloqueá-lo.

Eu encontrei a passagem de uma página ASPX para um manipulador ASHX fixa o meu problema de redirecionamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top