Pregunta

Estoy transmitiendo 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. Por lo que sé, esto solía funcionar (en los últimos 5 años aproximadamente) en todas las versiones de IE, pero nuestros clientes solo recientemente han comenzado a informar problemas. Sospecho que la opción de seguridad No guardar páginas encriptadas en el disco solía estar deshabilitada de manera predeterminada y en algún momento se habilitó de forma predeterminada (Opciones de Internet - > Avanzado - > Seguridad). Desactivar esta opción ayuda, como una solución alternativa, pero no es viable como una solución a largo plazo.

El mensaje de error que estoy recibiendo es:

  

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

     

Internet Explorer no pudo abrir este sitio de Internet. El sitio solicitado no está disponible o no se puede encontrar. Inténtalo de nuevo más tarde.

La herramienta utilizada para crear el PDF es ActiveReports de DataDynamics . Una vez que se crea el PDF, aquí está el código para enviarlo:

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 especifico explícitamente el control de caché, .NET envía no-cache en mi nombre, por lo que he intentado configurar el control de caché en: private or public o maxage = #, pero ninguno de ellos parece trabajo.

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

  

HTTP / 1.1 200 OK
  Cache-Control: max-age = 1
  Fecha: Mié, 29 de julio de 2009 17:57:58 GMT
  Tipo de contenido: aplicación / pdf
  Servidor: Microsoft-IIS / 6.0
  MicrosoftOfficeWebServer: 5.0_Pub
  Desarrollado por X: ASP.NET
  Versión X-AspNet: 2.0.50727
  disposición de contenido: archivo adjunto; nombre_archivo = declaración.pdf
  Codificación de contenido: gzip
  Variar: aceptar-codificar
  Transfer-Encoding: fragmentado

Tan pronto como apago el Fiddler e intento nuevamente, falla nuevamente. Otra cosa que noté es que cuando Fiddler se está ejecutando, aparece un mensaje de advertencia Hay un problema con el 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á apagado, no encuentro esta advertencia de seguridad y falla de inmediato.

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

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

Según la búsqueda de Google, parece haber muchos informes de este mismo problema en toda 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 una ETag, la fecha de LastModified, la eliminación del encabezado Vary (usando Fiddler) y docenas de combinaciones de los encabezados Cache-Control y / o Pragma. Intenté '' Content-Transfer-Encoding: binary '' así como " application / force-download " para el ContentType. Nada ha ayudado hasta ahora. Hay un pocos Microsoft KB artículos , todo lo cual indica 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é un correo electrónico al archivo .SAZ de Fiddler a EricLaw y pudo reproducir el problema al depurar IE, pero todavía no hay soluciones. La recompensa va a expirar ...

¿Fue útil?

Solución 2

Después de dos semanas en una persecución de ganso salvaje, no he podido encontrar ninguna combinación de cambios de código que permita este método de transmisión de documentos PDF, Excel o Word cuando ' No guarde las páginas cifradas en el disco 'la opción está activada.

Microsoft ha dicho que este comportamiento es por diseño en varios artículos de KB y correos electrónicos privados. Parece que cuando la opción ' No guardar las páginas cifradas en el disco ' está activada, IE se está comportando correctamente y está haciendo lo que se le dice que haga. Esta publicación es el mejor recurso que he encontrado hasta ahora explica por qué esta configuración estaría habilitada y las ventajas y desventajas de habilitarla:

  
    
      

" El ' No guardar 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 los archivos en la memoria caché durante una conexión SSL (HTTPS), independientemente de si el servidor web informa que puede hacerlo.

             

¿Cuál es la ventaja de activar esta función? La seguridad es la razón número uno por la cual la función está activada. Las páginas no se almacenan en la caché de archivos temporales de Internet.

             

¿Cuál es la desventaja? Rendimiento lento, ya que no se guarda nada en el caché, incluso esa imagen de 1 byte gif utilizada una docena de veces en la página debe ser recuperada desde el servidor web cada vez. Para empeorar las cosas, algunas acciones del usuario pueden fallar, por ejemplo, se eliminarán los archivos descargados y se presentará un error o se abrirá un documento PDF al nombrar algunos escenarios. & Quot;

    
  

La mejor solución que podemos encontrar en este momento es comunicar a nuestros clientes y usuarios que existen alternativas para usar esta configuración:

  
    
      

" Utilice 'Vaciar carpeta temporal de archivos de Internet cuando el navegador está cerrado'. Cada vez que se cierra el navegador, todos los archivos se eliminarán de la memoria caché, siempre que no haya un bloqueo en un archivo desde otra instancia del navegador o alguna aplicación externa.

             

Se debe tener mucha consideración antes de utilizar ' No guardar las páginas cifradas en el disco '. Suena como una gran característica de seguridad y es, pero los resultados del uso de esta característica pueden hacer que las llamadas a la mesa de ayuda aumenten debido a fallas en la descarga o un rendimiento lento. & Quot;

    
  

Otros consejos

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

Por lo general, diría que el culpable más probable es su encabezado Vary, ya que estos 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 hayas escrito reglas), y parece que estás diciendo que sí, lo que sugiere que tal vez haya algún problema de sincronización de algún tipo.

> No guardar las páginas cifradas en la opción de seguridad del disco que solía estar deshabilitada por defecto

Esta opción está aún deshabilitada de forma predeterminada (en IE6, 7 y 8), aunque los administradores de TI pueden activarla a través de la Política de grupo, y algunas de las principales empresas lo hacen.

Por cierto, la razón por la que ve el error de certificado mientras ejecuta Fiddler es que no ha elegido confiar en el certificado raíz de Fiddler; consulte http://www.fiddler2.com/fiddler/help/httpsdecryption.asp para más información sobre este tema.

Tuve un problema similar con los archivos PDF que quería transmitir. Incluso con Response.ClearHeaders () vi encabezados de Pragma y Cache-Control en tiempo de ejecución. La solución fue borrar los encabezados en IIS (haga clic con el botón derecho - > Propiedades en la página que carga el PDF, luego " encabezados Http " pestaña).

Encontré 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

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

ATT: Mr.Dark

Hace mucho tiempo que enfrentamos un problema similar: lo que hicimos fue nosotros (esto es Java EE). En la configuración de la aplicación web agregamos

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

Esto hará que cualquier PDF proveniente de su aplicación web se descargue en lugar de que el navegador intente procesarlo.

EDIT : parece que lo estás transmitiendo. En ese caso, utilizará un tipo mime como aplicación / flujo de octetos en su código y no en la configuración. Entonces aquí en lugar de

Response.ContentType = "application/pdf"

usarás

Response.ContentType = "application/octet-stream"

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

Leí sobre su persecución de ganso de control de caché, pero compartiré mío, que satisfizo mis necesidades , en caso de que ayude.

intenta deshabilitar la compresión gzip.

Agregándolo aquí con la esperanza de que alguien pueda encontrar esto útil en lugar 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();

Al igual que el OP, me rasqué la cabeza durante días tratando de hacer que esto funcionara, pero al final lo hice, así que pensé en compartir mi 'combinación' de encabezados:

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

¡Espero que eso le ahorre a alguien en algún lugar!

Me encontraba con un problema similar al intentar transmitir un PDF a través de 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é que cambiar de una página ASPX a un controlador ASHX solucionó mi problema de redirección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top