Laden...

Streaming in ashx - ist der Client noch verbunden?

Erstellt von Golo Roden vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.239 Views
Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren
Streaming in ashx - ist der Client noch verbunden?

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

www.goloroden.de
www.des-eisbaeren-blog.de

D
55 Beiträge seit 2008
vor 15 Jahren

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

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

D
55 Beiträge seit 2008
vor 15 Jahren

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

5.941 Beiträge seit 2005
vor 15 Jahren

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

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

Genial 😃

Danke!

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de