2013-03-23 9 views
6

Sto memorizzando i documenti in un database e ho una API per il download dei documenti.API Asp.Net MVC 4: download di docx in errore in IE8

Il download di docx e xlsx funziona bene in IE9, Chrome e FF, ma non riesce in un vero e proprio IE8 (IE 9 in modalità IE8 anche funziona)

Il messaggio di errore ottengo è il seguente:.

Impossibile scaricare 393 da idler2.

Impossibile aprire questo sito Internet. Il sito richiesto è non disponibile o non può essere trovato. Per favore riprova più tardi.

con la seguente intestazione della risposta: HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache

Content-Length: 10255 
Content-Type: application/octet-stream 
Expires: -1 
Server: Microsoft-IIS/7.5 
Content-Disposition: attachment; filename=document.docx 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Sat, 23 Mar 2013 11:30:41 GMT 

Questo è il mio metodo API:

public HttpResponseMessage GetDocumentContent(int id) 
{ 
    Document document = Repository.StorageFor<Client>().GetDocument(id); 
    HttpResponseMessage response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
    response.Content = new ByteArrayContent(document.GetBuffer()); 
    response.Content.Headers.ContentLength = document.GetBuffer().Length; 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     //FileName = document.GetFileName(), 
     FileName = "document.docx", 
     DispositionType = "attachment" 
    }; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");    
    return response; 
} 

Ho provato diverse varianti sulla disposizione del contenuto e sull'intestazione del contenuto, ma senza fortuna ..

risposta

2

Solo il rimedio che ho trovato fino ad ora è quello di memorizzare il file in una cartella temporanea e restituire l'url di download. Il client (javascript) può quindi aprire una nuova finestra.

Non proprio bello, ma sembra che l'API MVC 4 apporti alcune limitazioni.

9

Suppongo che tu abbia esperienza in SSL. Se è così allora questo è un known issue. Questo articolo parla dei documenti di Office ma questo problema si applica a tutti i tipi di file.

La risoluzione di questo articolo è quella di rimuovere l'intestazione senza cache ma c'è dell'altro. Quando IE8 comunica con il sito Web tramite SSL, IE8 applica qualsiasi richiesta di no-cache. Se l'intestazione o le intestazioni sono presenti, IE8 non memorizza nella cache il file. Di conseguenza, non può aprire il file. Tutto questo è specifico per IE5 a IE8.

In MVC Web API in realtà richiede un altro passaggio. Poiché stai creando un nuovo HttpResponseMessage devi anche creare un CacheControlHeaderValue sull'intestazione del messaggio. Non dovresti impostare alcuna proprietà di intestazione, basta istanziarne una nuova. Le intestazioni imposteranno automaticamente ciò che è necessario in modo da non dover modificare le proprietà.

public HttpResponseMessage GetDocumentContent(int id) 
{ 
    Document document = Repository.StorageFor<Client>().GetDocument(id); 
    HttpResponseMessage response = Request.CreateResponse(System.Net.HttpStatusCode.OK); 
    response.Headers.CacheControl = new CacheControlHeaderValue(); // REQUIRED  
    response.Content = new ByteArrayContent(document.GetBuffer()); 
    response.Content.Headers.ContentLength = document.GetBuffer().Length; 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = "document.docx" 
    }; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
    return response; 
} 

Ho avuto il problema esatto ma questo l'ha risolto.

+1

Spot on! Grazie mille. – Frans

+1

funziona perfettamente, grazie! –

+0

+1: ha avuto il problema, risolto usando la tua risposta, ma ha un commento aggiuntivo: si è manifestato in IE 11, Google Chrome e Firefox 43.0.4, ma dipendeva dalle dimensioni del PDF che stavamo richiedendo: il limite era trovato per essere circa 50 KB ... politiche di caching diverse in base alla dimensione !? – dlatikay