Pergunta

Response.Write("<script language=\"javascript\">window.open( with https and pdf

O que fazemos em um 1.1.4332 aplicação Asp.Net é o seguinte:

um botão aciona um evento de servidor que faz algum processamento e coloca os dados em um objeto de sessão depois que o seguinte código é executado:

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

este abre uma página que transmite um pdf com a nova janela do navegador

basicamente com o seguinte código (eu sei que coisas está faltando aqui, mas isso realmente não mater para a pergunta)

byte [] = pdfbytes Convert.FromBase64String (rapportB64);

Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = GetContentType(format);
string header = GetContentDispostionHeader(fileName, format, type);
Response.AddHeader("Content-Disposition", header);
Response.BinaryWrite(pdfbytes);         
Response.End();

Ok este código funciona!

Apenas não no IE6 e IE7 quando usando HTTPS

Ao usar o IE6 com HTTPS que resulta em uma (não um pdf que se abre em um navegador) guardar como caixa de diálogo Ao usar IE7 com HTTPS que resulta em uma tela em branco Ao usar o Firefox funciona muito bem

Se eu simular o processamento do lado do servidor extra no page_load para colocar os dados necessários na sessão e substituir o botão com um link que abre a mesma página de geração de pdf em uma nova janela, o código funciona.

Para a aplicação real não é uma opção para obter os dados necessários antes que o botão é clicado.

Então, eu realmente gostaria de obter o código a seguir para o trabalho

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

Perguntas: Alguém sabe por que este código não funciona no IE6 e IE7 quando usando HTTPS? O que é necessário para obter o código de trabalho?

Informações adicionais:

  • Eu não tentei usar response.write mas apenas um atrás de window.open javascript o botão, isso tem o mesmo efeito
  • quando pesquisando para pdf streaming, você pode encontrar um monte de pessoas que tenham problemas com isso, principalmente eles definir comprimentos de cabeçalho ou outras propriedades ou bandeiras de compactação de arquivos estáticos no IIS. Estou bastante confiante de que eu tentei-los todos.
  • Adobe Acrobat definições do leitor, as configurações do navegador ou qualquer outro cliente configurações secundários não parece ser o problema. Testado em diferentes máquinas, com obras http, com https isso não acontece.
  • Alternar entre https e http pode ter algo a ver com isso, mas quando eu definir IE para me dizer quando eu sou comutação, nenhuma mudança parece ocorrer durante o teste.
  • Ao substituir a parte window.open com um response.redirect em seguida, o código também funciona, não apenas em uma nova janela

Qualquer ajuda seria muito apreciada!


Tal como solicitado os cabeçalhos, como mostrado por Fiddler:

   HTTP/1.1 200 OK
   Server: Microsoft-IIS/5.1
   Date: Thu, 05 Mar 2009 14:18:36 GMT
   X-Powered-By: ASP.NET
   X-AspNet-Version: 1.1.4322
   Content-Disposition: Inline;filename=APKrapport.pdf
   Cache-Control: private
   Content-Type: application/pdf; charset=utf-8
   Content-Length: 28307
Foi útil?

Solução 3

Depois de muita tentativa e erro eu encontrei uma solução de trabalho, ainda não tem certeza por que o outro código não funciona.

Esse código funciona:

StringBuilder js = new StringBuilder("<script language=\"javascript\">");
js.Append("_window = window.open(\"\",'_new');");
js.Append("_window.document.open(\"application/pdf\");");
js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
js.Append("_window.document.close();");
js.Append("</script>");

Response.Write(js.ToString());

Deve ter algo a ver com o tipo mime.

Ele tem um problema embora. Quando IE está definida para mostrar quando você alternar entre HTTP e HTTPS este código vai dar a mensagem duas vezes. O código a seguir não muda, mas faz com que o carregamento da página de ApkRapportPage para ser disparado duas vezes.

StringBuilder js = new StringBuilder("<script language=\"javascript\">");
js.Append("_window = window.open(\"ApkRapportPage.aspx\",'_new');");
js.Append("_window.document.open(\"application/pdf\");");
js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
js.Append("_window.document.close();");
js.Append("</script>");

Response.Write(js.ToString());

Outras dicas

anexos Chegar ao abrir a maneira que você quer tem tudo a ver com os cabeçalhos que você envia. Se você localizar a uma página .aspx que deseja agir como um recurso dinâmico PDF esses cabeçalhos HTTP tornar-se cada vez mais importante.

Este website afirma uma série de razões pelas quais ele pode não funcionar em IE.

  1. Definir o tipo de conteúdo da resposta a "application / pdf", ex. response.setContentType ( "application / pdf");
  2. Adicionar um parâmetro fictício no final da URL, como: http:? //x.y.z/DoGenCompStmt filename = dummy.pdf porque o IE ignora tipos de conteúdo, então você precisa dar-lhe uma dica, e a extensão ".pdf" é uma maneira fácil.
  3. Defina o "content-length" sobre a resposta, caso contrário o plugin Acrobat Reader pode não funcionar correctamente, ex. response.setContentLength (bos.size ());
  4. Uma coisa adicional que parece ajudar alguns navegadores IE é ter também: response.setHeader ( "Content-Disposition", "inline; filename = somepdf.pdf");

EDIT: desde que você já tentou todas as opções acima só posso apontar-lhe o RFC para o índice disposição que ao meu conhecimento é a única maneira de dizer um navegador como lidar com conteúdo binário.

Editar : o que realmente ajuda é ver a cabeçalhos HTTP que atualmente retorna quando você tenta abrir o pdf no navegador. Fiddler faz um ótimo trabalho em pegar o tráfego

Você seria melhor usar um manipulador genérico (.ASHX) para atender a esse tipo de conteúdo, em vez de tentar forçar uma página da web para servir conteúdo diferente de HTML.

Se você está recebendo uma página em branco ao tentar visualizar uma linha PDF no navegador IE7 e você estiver usando Acrobat versão 6. Atualize a sua versão do Acrobat para o problema resolve.

Note que este problema não está relacionado com HTTPS, o mesmo problema (ea mesma correção) se aplica para HTTP.

A correção funciona porque o problema com o IE é que ele não exibir PDF em uma janela abriu-script, se o PDF é carregado ao mesmo tempo. (Desconhecido porquê, mas este é o cerne do problema, e a correção.)

Eu aviso que o seu tipo de conteúdo retornado é Hosed

"Content-Type: application / pdf; charset = utf-8"

Quando você transmitir o conteúdo para a página aspx garantir que você definir o

Response.charset = ""
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top