2012-08-23 10 views
5

Ho un file ashx con IHttpHandler. Quando trasmetto alcuni dati a questo IHttpHandler, faccio un po 'di lavoro, creo un file e poi voglio che quel file sia restituito all'utente in modo che possa salvare il file tramite il browser.Scrittura di file su HttpResponse, il browser non richiede di salvare

Con il file creato, questo è il modo tento di scrivere il file torna alla risposta:

HttpResponse response = context.Response; 
response.ClearContent(); 
response.Clear(); 
response.ContentType = "application/octet-stream"; 
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT"); 
response.WriteFile("C:\tempstuff\MYFILE.EXT"); 

In un blocco finally più tardi, chiamerò:

response.End() 

Quando ho chiama questo gestore, non succede nulla. La risposta 200 viene restituita, non vengono emessi errori, ma il browser non chiederà all'utente di salvare questo file.

Ecco cosa la risposta, come catturata da Fiddler, si presenta come:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Thu, 23 Aug 2012 12:12:19 GMT 
X-AspNet-Version: 4.0.30319 
Content-Disposition: attachment; filename=MYFILE.EXT 
Cache-Control: private 
Content-Type: application/octet-stream 
Content-Length: 781053 
Connection: Close 

[raw content of the file here] 

Questa risposta è corretto per me. Contiene il contenuto del file, tuttavia in nessuno dei principali browser, nessuna finestra di dialogo file richiede di salvare il file.

Cosa sto facendo di sbagliato qui?

Aggiornamento: In caso di aiuto, qui è dove sto usando JavaScript dalla mia applicazione web per chiamare questo HttpHandler.

$.ajax({ 
    type: 'POST', 
     url: ashxUrl, 
     data: postData, 
     success: function (result) { 
      // Doin' stuff on success 
     }, 
     error: function (error) { 
      // Doin' stuff on error. 
     } 
}); 
+0

Ho provato la stessa identica cosa. Ho creato una semplice pagina 'Download.ashx' con il codice sopra, e posta su di essa da un'altra pagina,' Default.aspx'. In tutti e tre i browser (IE, FF, Chrome), funziona perfettamente e sto ottenendo quasi gli stessi header di Fiddler. Non sai cos'altro potrebbe succedere? – mellamokb

+0

Interessante! Forse sarebbe utile descrivere il mio JavaScript dove sto facendo esplicitamente questa richiesta di chiamata. Modificherò il post principale per includere questo snippet. EDIT: ho aggiunto lo snippet JS. –

+6

Ah. Sì, questo aiuta. Non puoi fare un [scaricare file tramite AJAX] (http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-ie-some-info-in -corpo). Avrai bisogno di una soluzione alternativa [come questa] (http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data). – mellamokb

risposta

2

Hai detto che vuoi che i risultati della chiamata web siano resi disponibili per il tuo javascript. Sarebbe estremamente fastidioso se ciò inducesse il browser a chiedervi di salvarlo, poiché in tal caso tutto l'AJAX sarebbe impossibile.

Si desidera che il browser effettui la chiamata. Per un GET sarebbe una semplice questione di impostare self.location.href. Per un POST il modo più semplice è normalmente compilare un modulo nascosto con i dati e quindi submit() esso.