2009-07-29 16 views
12

Transfiero un PDF al navegador en ASP.NET 2.0. Esto funciona en todos los navegadores a través de HTTP y todos los navegadores excepto IE a través de HTTPS. Hasta donde sé, esto solía funcionar (durante los últimos 5 años más o menos) en todas las versiones de IE, pero nuestros clientes solo recientemente han comenzado a informar problemas. Sospecho que el No guardar las páginas cifradas en el disco opción de seguridad solía estar deshabilitado de forma predeterminada y en algún momento se convirtió en habilitado por defecto (Opciones de Internet -> Avanzado -> Seguridad). Desactivar esta opción ayuda, como solución alternativa, pero no es viable como una solución a largo plazo.Generando PDF, error con IE y HTTPS

El mensaje de error que recibo es:

Internet Explorer no puede descargar desde OutputReport.aspx www.sitename.com.

Internet Explorer no pudo abrir este sitio de Internet. El sitio solicitado no está disponible o no se puede encontrar. Por favor, inténtelo de nuevo más tarde.

La herramienta utilizada para crear el PDF es ActiveReports desde DataDynamics. Una vez creado el PDF, aquí está el código para enviar hacia abajo:

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: Si no especifica explícitamente Cache-control, entonces envía .NET no-cache en mi nombre, así que he intentado fijar cache-control a: private or public o maxage = #, pero ninguno de ellos parece funcionar.

Aquí está el giro: cuando ejecuto Fiddler para inspeccionar los encabezados de respuesta, todo funciona bien. Las cabeceras que recibo son:

HTTP/1.1 200 OK
Cache-Control: max-age = 1
Fecha: Miér 29 Jul 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-Version: 2.0.50727
Content-Disposition: attachment; archivo = statement.pdf
Content-Encoding: gzip
Vary: Accept-Encoding
Transfer-Encoding: fragmentada

Tan pronto como me vuelvo violinista e intente de nuevo, vuelve a fallar. Otra cosa que noté es que cuando Fiddler se está ejecutando recibo un Hay un problema con el mensaje de advertencia del certificado de seguridad de este sitio web, y tengo que hacer clic en Continuar a este sitio web (no recomendado) para pasar. Cuando Fiddler está desactivado, no encuentro esta advertencia de seguridad y falla de inmediato.

Tengo curiosidad por saber qué está sucediendo entre Fiddler y el navegador para que funcione cuando Fiddler se está ejecutando pero se rompe cuando no lo está, pero más importante aún, ¿alguien tiene alguna idea de cómo podría cambiar mi código para transmitir PDF a IE? trabajar sin hacer cambios en la máquina del cliente?

Actualización: Los problemas del Fiddler se han resuelto, muchas gracias EricLaw, por lo que ahora se comporta de manera constante (roto, con o sin Fiddler ejecutándose).

Según la búsqueda en Google, parece que hay muchos informes de este mismo problema en la web, cada uno con su propia combinación específica de encabezados de respuesta que parecen solucionar el problema para sus casos individuales. He intentado muchas de estas sugerencias, incluida la adición de un ETag, la fecha de LastModified, la eliminación del encabezado Vary (con Fiddler) y docenas de combinaciones de los encabezados Cache-Control y/o Pragma. Intenté "Content-Transfer-Encoding: binary" así como también "application/force-download" para ContentType. Nada ha ayudado hasta ahora. Hay un fewMicrosoftKBarticles, todos los cuales indican que Cache-Control: no-cache es el culpable. ¿Alguna otra idea?

Actualización: Por cierto, para completar, este mismo problema ocurre con las salidas de Excel y Word también.

Actualización: No se ha realizado ningún progreso. Envié por correo electrónico el archivo .SAZ de Fiddler a EricLaw y pudo reproducir el problema al depurar IE, pero todavía no hay soluciones. Bounty va a caducar ...

Respuesta

2

Después de dos semanas en una búsqueda inútil, no he podido encontrar ninguna combinación de cambios de código que permitan este método de transmisión de documentos PDF, Excel o Word cuando el ' No guarde páginas encriptadas en el disco 'la opción está activada.

Microsoft ha dicho que este comportamiento es por diseño en una serie de artículos de KB y correos electrónicos privados. Parece que cuando la opción ' No guardar páginas encriptadas en el disco' está activada, IE se está comportando correctamente y haciendo lo que se le dice que haga. This post es el mejor recurso que he encontrado hasta ahora que explica por qué esta configuración se habilita y los pros y los contras de lo que le permite:

"La ' No guardar las páginas cifradas en el disco' entra en juego cuando se trata de conexiones SSL (HTTPS). Al igual que un servidor web puede enviar información sobre cómo almacenar en caché un archivo, básicamente se puede configurar Internet Explorer para que no guarde archivos en la caché durante una conexión SSL (HTTPS) independientemente el servidor web aconseja que pueda.

¿Cuál es la ventaja de convertir esto función activada, la seguridad es la razón número uno por la cual la función está activada. Las páginas no se almacenan en el caché de Archivos temporales de Internet.

¿Cuál es el inconveniente? Rendimiento lento, ya que no se guarda nada en la memoria caché, incluso esa imagen gif de 1 byte utilizada una docena de veces en la página debe ser extraída del servidor web cada vez. Para empeorar las cosas, algunas acciones del usuario pueden fallar, como archivos descargados se eliminarán y presentan un error o abrir documentos PDF fallarán para nombrar unos pocos escenarios."

La mejor solución que podemos encontrar por lo este punto es comunicar a nuestros clientes y usuarios que existen alternativas a la utilización de esta configuración:

"uso 'Vaciar la carpeta de archivos temporales de Internet cuando se cierre el explorador'. Cada vez que el navegador se cierra, todos los archivos se eliminarán de la memoria caché, suponiendo que no haya un bloqueo en un archivo de otra instancia del navegador o de alguna aplicación externa.

Se debe prestar mucha atención antes de utilizar ' No guarde las páginas encriptadas en el disco'. Suena como una gran característica de seguridad y lo es, pero los resultados del uso de esta función pueden hacer que sus llamadas al servicio de asistencia técnica aumenten debido a fallas en la descarga o a un rendimiento lento."

0

¿Qué versión de IE? Recuerdo que Microsoft lanzó a Hotfix for IE6 para este problema. Espero que sea de alguna utilidad?

+1

IE6, IE7 e IE8 son todos afectados. – wweicker

3

Su Cache-Control encabezado es incorrecto. Debe ser Cache-Control: max-age = 1 con el guión en el centro. Intenta arreglar eso primero para ver si hace la diferencia.

Normalmente, yo diría que el culpable más probable es su encabezado Vary, ya que tales encabezados a menudo causan problemas con el almacenamiento en caché en IE: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx. Es posible que desee intentar agregar un ETAG a los encabezados de respuesta.

Fiddler no debería tener ningún impacto en la capacidad de almacenamiento en caché (a menos que haya escrito reglas), y parece que está diciendo que sí, lo que sugiere que tal vez haya algún problema de tiempo.

> No guardar las páginas cifradas en la opción de seguridad de disco solía ser desactivadas por defecto

Esta opción es siendo desactivado por defecto (en IE6, 7 y 8), aunque los administradores de TI pueden convertir a través de la Política de grupo, y algunas compañías importantes lo hacen.

Dicho sea de paso, el motivo por el que ve el error de certificado al ejecutar Fiddler es porque no ha elegido confiar en el certificado raíz de Fiddler; vea http://www.fiddler2.com/fiddler/help/httpsdecryption.asp para más sobre este tema.

+0

Gracias por su respuesta detallada. Repare el encabezado de control de caché y agregué un ETAG, ninguno de los cuales solucionó el problema. Después de elegir confiar en el certificado raíz de Fiddler, ahora puedo reproducir el problema cuando se está ejecutando Fiddler. Antes de hacer esto, el PDF funcionaría DESPUÉS de hacer clic en "Continuar a este sitio web (no recomendado)", como usted dice, tal vez un problema de tiempo de algún tipo. – wweicker

+0

Si, dentro de Fiddler, utiliza la pestaña Filtros para eliminar el encabezado de respuesta "Variar", ¿hay algún cambio? – EricLaw

+0

Sin cambios después de eliminar el encabezado Vary ...: ~ \ – wweicker

1

Nos hemos enfrentado a un problema similar hace mucho tiempo, lo que hicimos fue (esto es Java EE). En la configuración de aplicaciones web añadimos

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

Esto hará que cualquier PDF que viene de su aplicación web para descargarse en lugar del navegador tratando de hacer.

EDIT: parece que la estás reproduciendo. En ese caso, usará un tipo mime como application/octet-stream en su código y no en la configuración. Así que aquí en lugar de

Response.ContentType = "application/pdf" 

que va a utilizar

Response.ContentType = "application/octet-stream" 
+0

Desafortunadamente esto no ayudó. : ~/ – wweicker

0

intento para desactivar la compresión gzip.

+0

Apagar la compresión gzip no ayudó. :( – wweicker

1

he encontrado que esto parecía funcionar para mí:

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 
2

He tenido un problema similar con los archivos PDF que quería transmitir Incluso con Response.ClearHeaders() vi Pragma y Cache. Se han agregado encabezados de control en tiempo de ejecución. La solución fue borrar los encabezados en IIS (clic con el botón derecho en Propiedades en la página que carga el PDF y luego en la pestaña "Encabezados Http")

1

RESUELTO: Este es un problema de IE, no de apli catión ... arreglarlo con esto: http://support.microsoft.com/kb/323308 Funciona perfecto para mí, después de intentar durante mucho tiempo.

ATT: Mr.Dark

0

Adición de aquí con la esperanza de que alguien pueda resultar útil en vez de ir a través de los enlaces.

Aquí está mi 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(); 
0

Al igual que la OP estaba rascando la cabeza durante días tratando de conseguir que esto funcione, pero lo hice, al final, así que pensé que me gustaría compartir mi 'combinación' de cabeceras:

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

la esperanza de que alguien en algún lugar ahorra un poco de dolor!

0

Me encontré con un problema similar al intentar transmitir un PDF sobre SSL y ponerlo dentro de un iframe u objeto. Estaba descubriendo que mi página aspx seguiría redirigiendo a la versión no segura de la URL, y el navegador la bloquearía.

Encontré cambiar de una página ASPX a un controlador ASHX solucionado mi problema de redirección.