Einige Fragen über das schreiben auf ASP.NET Antwort stream
Mache ich tests mit ASP.NET HttpHandler für den download einer Datei schreiben, die direkt auf den response-stream, und ich bin mir ziemlich sicher, dass über die Art, wie ich bin, es zu tun. Dies ist ein Beispiel-Methode, in der Zukunft die Datei konnte gespeichert werden, in ein BLOB in der Datenbank:
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
Aber ich bin mir nicht sicher, ob dies richtig ist, oder gibt es einen besseren Weg, es zu tun.
Meine Fragen sind:
- Wenn ich öffnen Sie die url mit dem browser, erscheint das Dialogfeld "Datei Speichern"... aber wie es scheint, der server hat bereits begonnen, push-Daten in den stream, bevor ich auf "Speichern" klicken, ist das normal?
- Wenn ich entfernen Sie die Zeile"Antwort.Flush()", wenn ich öffnen Sie die url mit dem browser, ... ich sehe, wie der web-server schiebt Daten, sondern die "Datei Speichern" - dialog erscheint nicht, (oder zumindest nicht in einer angemessenen Zeit Mode) warum?
- Wenn ich öffnen Sie die url mit einem WebRequest-Objekt, sehe ich, dass die HttpResponse.ContentLength ist "-1", obwohl ich kann den stream und die Datei. Was bedeutet -1? Wann ist HttpResponse.ContentLength zeigen die Länge der Antwort? Zum Beispiel habe ich eine Methode zum abrufen einer großen xml-compresed mit deflate als binären Datenstrom, aber in diesem Fall..., wenn ich mit einem WebRequest, in der HttpResponse-ich kann tatsächlich sehen, die ContentLength mit der Länge des Streams, warum?
- Was ist die optimale Länge für die Byte [] - array, das ich als Puffer für eine optimale Leistung in einem web-server? Ich habe gelesen, dass zwischen 4K und 8K... aber welche Faktoren sollte ich berücksichtigen, um die richtige Entscheidung.
- Funktioniert diese Methode aufblasen der IIS-oder client-Arbeitsspeicher-Auslastung? oder ist es tatsächlich die Pufferung der übertragung korrekt?
Sorry für so viele Fragen, ich bin ziemlich neu in der web-Entwicklung 😛
Cheers.
- Sie sollten auch einen Blick auf die Boilerplate HttpHandler Implementierungen hier (haacked.com/archive/2005/03/17/...) und hier (hanselman.com/blog/...).
- Ihre Art zu lernen wird geschätzt. Zu gehen zu halten .
- Das funktioniert: [stackoverflow.com/questions/3362849/... [1]: stackoverflow.com/questions/3362849/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Content-Disposition
header). Daher weiß er nicht, um zu zeigen, eine Datei-dialog.Den
Content-Length
header wird nur gesetzt, wenn die gesamte Antwort ist gepuffert (Wenn Sie noch nie erröten) oder wenn Sie ihn selbst festlegen. In diesem Fall können und sollten Sie ihn selbst festlegen, schreiben SieFlush
innerhalb der Schleife, die Sie senden die Antwort unten den Draht sofort ohne Pufferung. Jedoch, für zusätzliche Leistung, können Sie die GZIP-Komprimierung.In #3 müssen Sie die content-length-header in der http-Antwort. Viele von denen die Werte stammen von http-Headern.
Ich glaube, Sie können ändern Sie die bufferring durch eine änderung der buffering-Eigenschaft des response-Objekts auf false. Habe es nicht getan, in eine Weile, also ich kann mich nicht erinnern, was es sein könnte.