2010-01-25 6 views
5

Ho un servizio .net in esecuzione sul computer locale (Windows 7 x64, IE8, .net 3.5, C#) che restituisce un file al browser in risposta a un'azione dell'utente. Utilizzando firefox o chrome, il file viene scaricato correttamente e la nostra applicazione viene lanciata tramite un tipo mime personalizzato e tutto va bene.IE8 non scaricherà un file con un mime/tipo personalizzato con UAC abilitato

Tuttavia, con IE8, viene visualizzata una finestra di dialogo "Impossibile scaricare il file da. Impossibile aprire questo sito Web. Il sito richiesto non è disponibile o non può essere trovato. Riprovare più tardi".

Utilizzando il violinista, ho verificato che IE riceve il payload dal servizio.

Se spengo UAC, IE scarica il file e avvia l'applicazione associata.

Disattivare UAC non è una soluzione praticabile, poiché i nostri clienti lo avranno abilitato.

Come è possibile ottenere IE8 per avviare l'applicazione associata con UAC abilitato?

EDIT:

Dopo una nuova registrazione di tipo mime con un ID programmatico come descritto here, posso ottenere IE per aprire mostrare la "Apri o Salva" finestra di dialogo per la seconda volta il collegamento è richiesto dalla barra degli indirizzi. Perché non funziona la prima volta?

+0

Il tipo MIME personalizzato è addirittura necessario? Non basterebbe 'application/octet-stream'? – Joey

+0

Buona domanda. Per quanto ne so, è come IE determina quale programma utilizzare per avviare un'applicazione. Questo è un circuito chiuso qui, è il nostro file di dati e il nostro spettatore. In quale altro modo dovremmo farlo? –

+0

Se usi un tipo mime generico come application/octet-stream e un'estensione di file personalizzata che hai registrato con il tuo viewer (all'interno dell'installer del visualizzatore), IE (e tutto il resto) lo visualizzerà allora? –

risposta

5

sono stato in grado di risolvere questo problema di oggi. Si scopre che il codebehind stava impostando la proprietà CacheControl della risposta a HttpCacheability.NoCache. Rimozione di quella riga di codice risolto il problema. L'altra metà della correzione stava registrando correttamente il tipo MIME e l'estensione del file con un ProgId.

Ho ridotto la risposta al solo content-disposition: attachment; filename=xxx e una scrittura binaria dei dati di stringa. IE visualizzava correttamente la finestra di dialogo Apri o Salva, anche se l'annusata del mime riportava il file come text/html (che in realtà avrebbe dovuto essere text/plain).

Ho aggiunto nuovamente l'intestazione del tipo di contenuto e ritestato, quindi l'opzione nosniff e ritestato e infine il controllo della cache. Tra ogni test, ho riavviato la VM per garantire che fosse un ambiente di test incontaminato (ad esempio, niente cache o precaricato). Solo la linea di controllo della cache ha influenzato il comportamento in modo negativo.

1

From MSDN

Se Internet Explorer conosce il Content-Type specificato e non ci sono dati Content-Disposition, Internet Explorer esegue un "sniff MIME," la scansione dei primi 200 byte del file per determinare se il la struttura del file corrisponde a tutti i tipi MIME conosciuti. Per ulteriori informazioni sullo sniffing MIME, vedere Rilevamento tipo MIME in Internet Explorer. Se l'annidamento MIME rileva un tipo MIME noto a Internet Explorer e il file non è stato già caricato da un mimefilter, Internet Explorer imposta tale estensione prima di posizionare il file nella cache del browser locale.

Infine, se non ci sono dati di tipo Content o Content-Disposition e lo sniff MIME non riconosce un tipo MIME noto, l'estensione del file è impostata sulla stessa estensione dell'URL utilizzato per scaricare il file.

Se il file è contrassegnato come "content-disposition = attachment" nell'intestazione HTTP, Internet Explorer considera il nome del file dall'URL come finale e non lo rinomina prima di inserirlo nella cache.

Content-Disposition = attaccamento è che la soluzione?!?

/Erling Damsgaard DNS-IT ApS

+0

No, non è così, anche se sembra che dovrebbe essere. –

1

Abbiamo riscontrato lo stesso problema nella distribuzione ClickOnce di www.Qiqqa.com. Sospetto che abbia a che fare con lo "sniffing di tipo MIME" che IE fa quando ottiene un'applicazione/octet-stream - credo di proteggere l'utente da cose malevole.

Ad ogni modo, per risolvere il problema, abbiamo modificato il tipo di mime dei nostri file .deploy in testo/chiaro - ovviamente non ideale, ma allo stesso tempo, non conosco uno scenario in cui potremmo avere un. distribuire il file sul nostro server che un utente dovrebbe accedere a ClickOnce esterno.

0

Per me la soluzione a questo problema è stata cambiando

 
Response.ContentType = "application/vnd.ms-excel"; 

a

 
Response.ContentType = "text/csv"; 
1

necessario assicurarsi "no-store" appare nella vostra intestazione prima "no-cache". Vedi questo post: http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no-cache.aspx

+0

questo a prima vista sembra essere un successo e un processo; Ma ha funzionato per me. Vedi anche [La stessa soluzione proposta sul blog MSDN] http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no-cache. aspx? pageIndex = 2 –