Domanda

Sto trasmettendo un PDF al browser in ASP.NET 2.0. Funziona in tutti i browser su HTTP e in tutti i browser tranne IE su HTTPS. Per quanto ne so, questo funzionava (negli ultimi 5 anni circa) in tutte le versioni di IE, ma solo recentemente i nostri clienti hanno iniziato a segnalare problemi. Sospetto che l'opzione di sicurezza Non salvare pagine crittografate su disco era disabilitata per impostazione predefinita e ad un certo punto è stata attivata per impostazione predefinita (Opzioni Internet - > Avanzate - > Sicurezza). Disattivare questa opzione aiuta, come soluzione, ma non è praticabile come soluzione a lungo termine.

Il messaggio di errore che sto ricevendo è:

  

Internet Explorer non può scaricare OutputReport.aspx da www.sitename.com.

     

Internet Explorer non è stato in grado di aprire questo sito Internet. Il sito richiesto non è disponibile o non può essere trovato. Riprova più tardi.

Lo strumento utilizzato per creare il PDF è ActiveReports da DataDynamics . Una volta creato il PDF, ecco il codice per inviarlo:

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 non specifico esplicitamente il controllo della cache, .NET non invia cache per mio conto, quindi ho provato a impostare il controllo della cache su: privato o pubblico o maxage = #, ma nessuno di questi sembra lavoro.

Ecco il colpo di scena: quando eseguo Fiddler per ispezionare le intestazioni di risposta, tutto funziona bene. Le intestazioni che ricevo sono:

  

HTTP / 1.1 200 OK
  Controllo cache: età massima = 1
  Data: mer 29 lug 2009 17:57:58 GMT
  Tipo di contenuto: application / pdf
  Server: Microsoft-IIS / 6.0
  MicrosoftOfficeWebServer: 5.0_Pub
  X-Powered-By: ASP.NET
  Versione X-AspNet: 2.0.50727
  disposizione dei contenuti: allegato; filename = statement.pdf
  Codifica del contenuto: gzip
  Vary: accetta-codifica
  Transfer-Encoding: chunked

Non appena spengo Fiddler e riprovo, fallisce di nuovo. Un'altra cosa che ho notato è che quando Fiddler è in esecuzione ricevo un messaggio di avviso Si è verificato un problema con il certificato di sicurezza di questo sito web e devo fare clic su Continua su questo sito Web (non consigliato) per superare. Quando Fiddler è spento, non riscontro questo avviso di sicurezza e non riesce immediatamente.

Sono curioso di sapere cosa sta succedendo tra Fiddler e il browser in modo che funzioni quando Fiddler è in esecuzione ma si interrompe quando non lo è, ma soprattutto, qualcuno ha qualche idea su come posso cambiare il mio codice in modo che lo streaming di PDF su IE funzioni senza apportare modifiche al computer client?

Aggiornamento: I problemi di Fiddler sono risolti, grazie mille EricLaw, quindi ora si comporta in modo coerente (rotto, con o senza Fiddler in esecuzione).

Sulla base della ricerca di Google, sembrano esserci molte segnalazioni di questo stesso problema in tutto il Web, ognuna con la propria combinazione specifica di intestazioni di risposta che sembrano risolvere il problema per i singoli casi. Ho provato molti di questi suggerimenti, tra cui l'aggiunta di un ETag, la data LastModified, la rimozione dell'intestazione Vary (usando Fiddler) e dozzine di combinazioni delle intestazioni Cache-Control e / o Pragma. Ho provato " Content-Transfer-Encoding: binary " così come " application / force-download " per ContentType. Finora nulla ha aiutato. Ci sono pochi Microsoft KB articoli , tutti che indicano che Cache-Control: no-cache è il colpevole. Altre idee?

Aggiornamento: A proposito, per completezza, questo stesso problema si verifica anche con output di Excel e Word.

Aggiornamento: non sono stati fatti progressi. Ho inviato il file .SAZ da Fiddler a EricLaw ed è stato in grado di riprodurre il problema durante il debug di IE, ma non ci sono ancora soluzioni. Bounty scadrà ...

È stato utile?

Soluzione 2

Dopo due settimane in una caccia all'oca selvatica, non sono stato in grado di trovare alcuna combinazione di modifiche al codice che consentirà questo metodo di streaming di documenti PDF, Excel o Word quando ' Non salvare pagine crittografate su disco 'è attivata.

Microsoft ha affermato che questo comportamento è in base alla progettazione in numerosi articoli KB e e-mail private. Sembra che quando l'opzione ' Non salvare pagine crittografate su disco ' viene attivata, IE si comporti correttamente e faccia ciò che gli viene detto di fare. Questo post è la miglior risorsa che ho trovato finora che spiega perché questa impostazione dovrebbe essere abilitata e i pro ei contro di abilitarla:

  
    
      

" Il ' Non salvare pagine crittografate su disco ' entra in gioco quando si tratta di connessioni SSL (HTTPS). Proprio come un server Web può inviare informazioni complete su come memorizzare nella cache un file, in pratica è possibile impostare Internet Explorer in modo da non salvare i file nella cache durante una connessione SSL (HTTPS), indipendentemente dal fatto che il server Web lo consiglia.

             

Qual è il vantaggio di attivare questa funzione, la sicurezza è il motivo numero uno per cui la funzione è attivata. Le pagine non sono memorizzate nella cache dei file temporanei Internet.

             

Qual è il rovescio della medaglia? Prestazioni lente, dal momento che nulla viene salvato nella cache anche quell'immagine gif a 1 byte utilizzata una dozzina di volte nella pagina deve essere recuperata ogni volta dal server web. A peggiorare le cose alcune azioni dell'utente potrebbero non riuscire, ad esempio i file scaricati verranno eliminati e un errore presentato o l'apertura di documenti PDF non riuscirà a nominare alcuni scenari. & Quot;

    
  

La migliore soluzione che possiamo trovare a questo punto è comunicare ai nostri clienti e utenti che esistono alternative all'utilizzo di questa impostazione:

  
    
      

" Usa "Svuota la cartella dei file temporanei Internet quando il browser è chiuso". Ogni volta che il browser chiude tutti i file verranno eliminati dalla cache presupponendo che non vi sia un blocco su un file da un'altra istanza del browser o da un'applicazione esterna.

             

È necessario prestare molta attenzione prima di utilizzare " Non salvare pagine crittografate su disco ". Sembra un'ottima funzionalità di sicurezza, ma i risultati dell'utilizzo di questa funzione potrebbero far aumentare le chiamate all'help desk per errori di download o prestazioni lente. & Quot;

    
  

Altri suggerimenti

L'intestazione Controllo cache non è corretta. Dovrebbe essere Cache-Control: max-age = 1 con il trattino nel mezzo. Prova a risolverlo prima per vedere se fa la differenza.

In genere, direi che il colpevole più probabile è l'intestazione Vary, poiché tali intestazioni spesso causano problemi con la memorizzazione nella cache in IE: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx . Potresti provare ad aggiungere un ETAG alle intestazioni di risposta.

Il violinista non dovrebbe avere alcun impatto sulla cache (a meno che tu non abbia scritto delle regole), e sembra che tu lo stia dicendo, il che suggerisce che forse c'è un problema di tempismo di qualche tipo.

> Non salvare le pagine crittografate sull'opzione di sicurezza del disco utilizzata per essere disabilitata per impostazione predefinita

Questa opzione è ancora disabilitata per impostazione predefinita (in IE6, 7 e 8), anche se gli amministratori IT possono attivarla tramite Criteri di gruppo e alcune grandi aziende lo fanno.

Per inciso, il motivo per cui viene visualizzato l'errore del certificato durante l'esecuzione di Fiddler è che non si è scelto di fidarsi del certificato radice di Fiddler; vedi http://www.fiddler2.com/fiddler/help/httpsdecryption.asp per ulteriori informazioni su questo argomento.

Ho avuto un problema simile con i file PDF che volevo trasmettere in streaming. Anche con Response.ClearHeaders () ho visto le intestazioni Pragma e Cache-Control aggiunte in fase di esecuzione. La soluzione era cancellare le intestazioni in IIS (tasto destro del mouse - > Proprietà sulla pagina caricando il PDF, quindi " intestazioni Http & tab; scheda).

Ho scoperto che questo sembrava funzionare per me:

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

RISOLTO: si tratta di un problema IE, non di applicazione ... risolverlo con questo: http://support.microsoft.com/kb/323308 Funziona perfettamente per me, dopo aver provato a lungo.

ATT: Mr.Dark

Abbiamo affrontato un problema simile molto tempo fa - quello che abbiamo fatto è stato noi (questo è Java EE). Nella configurazione dell'applicazione Web aggiungiamo

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

In questo modo qualsiasi pdf proveniente dalla tua applicazione web verrà scaricato al posto del browser che tenta di eseguire il rendering.

EDIT : sembra che tu lo stia trasmettendo in streaming. In tal caso, utilizzerai un tipo mime come application / octet-stream nel tuo codice e non nella configurazione. Quindi qui invece di

Response.ContentType = "application/pdf"

userete

Response.ContentType = "application/octet-stream"

Quale versione di IE? Ricordo che Microsoft ha rilasciato un aggiornamento rapido per IE6 per questo problema. Speri che sia di qualche utilità?

Ho letto del tuo inseguimento dell'oca controllo della cache, ma condividerò il mio, che ha soddisfatto le mie esigenze , nel caso in cui mi aiuti.

prova a disabilitare la compressione gzip.

Aggiungendolo qui nella speranza che qualcuno possa trovare questo utile invece di consultare i link.

Ecco il mio codice

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

Come l'OP mi grattavo la testa da giorni cercando di farlo funzionare, ma alla fine l'ho fatto, quindi ho pensato di condividere la mia "combinazione" di intestazioni:

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

Spero che possa salvare qualcuno da qualche parte nel dolore!

Stavo riscontrando un problema simile nel tentativo di trasmettere un PDF su SSL e inserirlo in un iframe o in un oggetto. Stavo scoprendo che la mia pagina aspx avrebbe continuato a reindirizzare alla versione non sicura dell'URL e il browser l'avrebbe bloccata.

Ho trovato il passaggio da una pagina ASPX a un gestore ASHX risolto il mio problema di reindirizzamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top