Laden...

[gelöst] HttpListener bricht Übertragung ab

Erstellt von jov97 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.526 Views
J
jov97 Themenstarter:in
13 Beiträge seit 2011
vor 11 Jahren
[gelöst] HttpListener bricht Übertragung ab

Moin,

ich habe ein kleine Webseite in C# geschrieben, ohne ASP.NET.

Nun lasse ich den Benutzer über ein normales HTML-Formular (POST, multipart/form-data) ein Bild hochladen. Dieses wird dann über den HTTP-Body zu mir geschickt.
Bis zu einer Bildgröße von etwa 50KB klappt das auch noch ganz gut, darüber allerdings wird der Dateitransfer einfach abgebrochen.

content-length stimmt, ich lese die Daten über den InputStream in einen Buffer. Der HttpListener scheint den Transfer aber schon vorzeitig abzubrechen.

Hat jemand eine Idee, woran das liegen könnte?

Beste Grüße!
jov97

Lieber eine Glatze als gar keine Haare.

16.842 Beiträge seit 2008
vor 11 Jahren

Du zeigst leider keinerlei Code. Nichts.

Biste bei Deiner Recherche des Problems auf Httplistener and file upload gestoßen? Ist der erste Google Treffer bei der Suche nach 'httplistener upload file'

J
jov97 Themenstarter:in
13 Beiträge seit 2011
vor 11 Jahren

Ah sorry. Ganz vergessen. Ich mache es ganz ählich wie der Herr bei stackoverflow:

HttpListenerContext context = Listener.GetContext();
HttpListenerRequest request = context.Request;

HttpListenerResponse response = context.Response;

Stream output = response.OutputStream;

byte[] buffer = new byte[request.ContentLength64];

request.InputStream.Read(buffer, 0, buffer.Length);

request.InputStream.Close();

Soviel zum Code. Wenn ich mir jetzt 'buffer' ausgeben lasse, sehe ich, dass ab ca 50KB nurnoch 0 steht (also Byte 0). Daraus schließe ich, dass der Buffer nicht bis zum Ende gefüllt wurde, also der OutputStream nicht vollständig übertragen wurde.
Liege ich da richtig? Und wenn ja, wie kann ich das verhindern?

Besten Dank!

Lieber eine Glatze als gar keine Haare.

1.346 Beiträge seit 2008
vor 11 Jahren

Read ließt wahrscheinlich nur, was bis zu diesem Zeitpunkt an Daten da ist. u musst diese also immer Stückeweise wegschreiben, bis du alles beisammen hast.

LG pdelvo

W
872 Beiträge seit 2005
vor 11 Jahren

int bytesRead=0;
while (bytesRead<request.ContentLength64)
   bytesRead+=request.InputStream.Read(buffer, bytesRead, buffer.Length-bytesRead);
request.InputStream.Close();

J
jov97 Themenstarter:in
13 Beiträge seit 2011
vor 11 Jahren

Vielen Dank!!!

LJ jov97

Lieber eine Glatze als gar keine Haare.

1.346 Beiträge seit 2008
vor 11 Jahren

Du musst aber aufpassen, das du keine Angriffsfläche für Angreifer bildest. Du reservierst so viel Bytes im Arbeitsspeicher, wie der Client behauptet zu senden. Wenn ich jetzt 5 große Requests starte läuft da ganz schnell der Arbeitsspeicher voll. Besser ist es vielleicht die Daten auf die Festplatte zu schreiben.

LG pdelvo

J
jov97 Themenstarter:in
13 Beiträge seit 2011
vor 11 Jahren

Joa, das stimmt... Ich werde die request ab einer bestimmten Größe einfach ablehnen. Geht ja schließlich nur um ein Bild.

Lieber eine Glatze als gar keine Haare.