Hallo,
folgendes Szenario: In einer .ashx-Datei streame ich Daten an den Client, indem die zu streamenden Daten in den Response.OutputStream geschrieben werden.
Nun könnte es ja sein, dass bei größeren Datenmengen der Client mittendrin "geht", sprich, die Verbindung abbricht.
Wie kann ich das auf dem Server feststellen, bzw wie stelle ich fest, ob ein Datenstream vollständig vom Client gelesen wurde oder nicht?
Hintergrund: Wie kann man am Server wenigstens halbwegs zuverlässig feststellen, ob ein Client einen Download erfolgreich abgeschlossen hat?
Viele Grüße,
Golo
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Ich denke das das gar nicht funktioniert, zumindest nicht so.
Ob ein Client einen Download wirklich 100%tig abgeschlossen hat ist so gut wie gar nicht zu ermitteln (Zumindester nicht ueber http weil -> Stateless)
Falls aber jemand eine Antwort kennt waere ich auch sehr darant intressiert...
Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop
Mal naiv gefragt: Angenommen, ich schreibe zig MByte in den OutputStream, der Client bricht mittendrin aber ab, was passiert dann eigtl mit dem OutputStream? Läuft der ins Leere? Erhält er intern eine Exception? ...?
Und wenn er abbricht, müsste man doch irgendwie ermitteln können, wie viele Bytes der Server übertragen hat?
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hm, das ist natuerlich eine berechtigte Frage.
In dem fall wird der Server natuerlich eine Rueckmeldung bekommen nehm ich an, denn wenn der User sonst den download abbricht, wuerde ja vlt seine Netzwerkkarte weiter mit Packeten bombadiert werden..
habe aber mal das hier gefunden:
http://www.megasolutions.net/AspNet/Abort-a-download-70261.aspx
darin heist es:
Based on my test, when you turn off buffer of the page resposne, it will
write out response headers at initial flush so that after the server-side
close or terminate the connection, the client-side will just act like the
response output finished. I've tried through exception or abort response or
worker thread but haven't got any effect. I think this due to the ASP.NET's
control over response is at a high application level that doen't deep
enough for the raw HTTP communication. For your scenario, you may consider
some IIS isapi filter solution as it can help much more control over the
underlying http communication.
Languages: C#, C, C++, Java, VB, PHP, ASP, HTML/XHTML, XML, CSS, JavaScript.
learning since: 1996
IDE's: Visual Studio 2008 Team Editon, Eclipse, Sharpdevelop / Monodevelop
Hallo zusammen
Mit ASP.NET hat man schon fast alle Möglichkeiten, so tief runter muss man dafür wohl nicht.
Wenn mich nicht alles täuscht sollte folgende Methode ziemlich zuverlässig sein:
public void ProcessRequest(HttpContext context) {
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("content-disposition", "attachment; filename=test.zip");
//context.Response.WriteFile("~/App_Data/test.jpg");
HttpResponse response = context.Response;
using (FileStream fs = new FileStream(context.Server.MapPath("~/App_Data/test.zip"), FileMode.Open)) {
long bytesLeft;
int bytesRead;
int bufferLen = 2048; // 524288
byte[] buffer = new byte[bufferLen];
bytesLeft = fs.Length;
while (bytesLeft > 0) {
if (response.IsClientConnected) {
bytesRead = fs.Read(buffer, 0, bufferLen);
response.OutputStream.Write(buffer, 0, bytesRead);
//Thread.Sleep(100);
response.Flush();
bytesLeft -= bytesRead;
if (bytesLeft == 0 && response.IsClientConnected) {
// Download successfull
}
} else {
bytesLeft = -1;
}
}
}
}
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Genial 😃
Danke!
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden