Domanda

Ho il seguente codice per il download del file:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

Quando lo eseguo sul mio IIS6 locale funziona benissimo. Il browser Web (testato su IE8, Firefox 3.5.2, Opera 10) mostra la lunghezza del file prima di iniziare a scaricare il file.

Quando eseguo questo codice su IIS7 remoto, il browser Web non mostra la lunghezza del file. La lunghezza del file è sconosciuta.

Perché non ottengo la lunghezza del file quando questo codice viene eseguito in IIS7?

È stato utile?

Soluzione

Usa Fiddler per controllare cosa viene effettivamente inviato. Suppongo che stai ricevendo la codifica a blocchi a causa del buffering impostato su false sul server IIS7.

A proposito, lascia cadere la risposta. E chiama la sua cosa piuttosto traumatica da fare ed è inutile (del resto lo è anche la chiamata a Clear).

Modifica

A rigor di termini quando si esegue lo streaming di contenuti con codifica in blocchi (che è desiderabile nel proprio scenario), l'intestazione Content-Length non dovrebbe essere presente (vedere RFC2616 Sezione 4.4 .) Mi sembra che IIS7 si impegni su se stesso per far rispettare questo. In effetti, ho avuto uno scenario ASP classico in cui IIS7 genera un errore quando il codice COM tenta di aggiungere un'intestazione Content-Length quando il buffering è disattivato.

Questo è davvero fastidioso perché, nonostante ciò che vorrebbe il comitato nelle torri d'avorio, questa intestazione fornisce all'utente finale un'informazione molto utile.

Altri suggerimenti

Grazie per questo post .... L'ho fatto funzionare per IE con la prima riga.

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top