Frage

ich folgenden Code für Dateidownload haben:

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

Wenn ich es auf meinem lokalen IIS 6 laufen, es funktioniert. Web-Browser (getestet auf IE8, Firefox 3.5.2, Opera 10) zeigt Dateilänge, bevor ich die Datei zu starten herunterladen.

Wenn ich diesen Code auf der Fernbedienung IIS7 laufen, Web-Browser zeigt keine Länge Datei. Dateilänge ist nicht bekannt.

Warum ich nicht bekommen, Dateilänge, wenn dieser Code unter IIS7 läuft?

War es hilfreich?

Lösung

Verwenden Sie Fiddler zu überprüfen, was tatsächlich gesendet wird. Meine Vermutung ist, Sie werden immer aufgeteilte Codierung als Folge der Pufferung auf dem IIS7-Server auf false gesetzt werden.

BTW, fällt die Response.End seine ziemlich traumatische Sache nennen zu tun und ist nicht erforderlich (was das betrifft, so der Aufruf von Clear ist).

Bearbeiten

Genau genommen, wenn sie mit aufgeteilte Codierung Streaming-Inhalten (die in Ihrem Szenario wünschenswert ist) die Content-Length-Header sollen nicht vorhanden sein (siehe RFC2616 Abschnitt 4.4 .) es scheint mir, dass IIS7 es auf sich selbst, dies zu erzwingen nimmt. In der Tat habe ich einen klassischen ASP-Szenario hatte, in dem IIS7 einen Fehler auslöst, wenn Code COM versucht einen Content-Length-Header hinzufügen, wenn Pufferung ausgeschaltet ist.

Das ist wirklich ärgerlich, weil trotz allem, was der Ausschuß in den Elfenbeintürmen möchte, diesen Header dem Endbenutzer ein sehr nützliches Stück Info geben.

Andere Tipps

Vielen Dank für diesen Beitrag .... Ich habe es für IE mit der ersten Zeile zu arbeiten.

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top