ServiceStack löst StackOverflowException aus, wenn große Daten empfangen werden

9

Ich verwende ServiceStacks JsonServiceClient mit Silverlight 5, um JSON-Daten von meinem ASP.Net-Server zu empfangen. Es funktioniert perfekt für kurze JSON-Zeichenfolgen, aber wenn es um sehr große Datenmengen geht, wird eine StackOverflowException in ServiceStack.ServiceClient.Web.AsyncServiceClient.ReadCallBack<> ausgelöst.

Also habe ich den neuesten Quellcode auf GitHub untersucht und festgestellt, dass die Daten blockweise aus einem Stream als Teile von 4096 Byte . Das Problem besteht darin, dass diese Methode einen Block liest und dem Stream sagt, dass er sich rekursiv aufrufen soll, wenn er fertig ist. Je mehr Daten wir erhalten, desto mehr rekursive Aufrufe treten auf. Deshalb stürzt die Anwendung ab, wenn die empfangenen Daten zu groß sind.

Ideen:

  • Refaktorieren Sie die Methode so, dass sie iterativ und nicht rekursiv ist. Es scheint eine schwere Aufgabe zu sein, mit all diesen bedingten Rückgaben, Warten, Versuchen und so ähnlich zu machen.
  • Erhöhen Sie die Blockgröße. Ich weiß nicht, ob es Gründe für 4096 gibt hier, also würde ich das lieber nicht alleine machen.

Jedenfalls, bevor ich den gesamten Quellcode herunterlade, modifiziere und kompiliere ihn selbst, würde ich gerne deine Meinung dazu hören. Ist es ein Fehler oder benutze ich ihn falsch?

    
chrwoizi 10.09.2013, 13:44
quelle

2 Antworten

1

Es gibt eine Beschränkung für die Länge der Zeichenfolge, die über die Leitung für Ihre JSON-Antwort gesendet wird. Bei einer externen Anwendung würden Sie wahrscheinlich niemals das Standardlimit erreichen. Bei internen Apps kannst du es jedoch treffen, da das Gewicht nicht so ist und ausfällt. Sie müssen Folgendes in Ihrer Datei web.config hinzufügen, um die Länge der JSON-Zeichenfolge zu maximieren.

Beachten Sie, dass Sie die Zeichenfolgenlänge nicht unbegrenzt festlegen können. Außerdem glaube ich nicht, dass Sie über 2147483644 gehen können.

%Vor%     
Nick 20.12.2013 18:27
quelle
0

Sie können immer einen neuen Thread erstellen und die Stack-Größe an den Konstruktor übergeben Das wird immer funktionieren Beachten Sie, dass Sie in einigen Situationen wie der ASP.NET-Entwicklung standardmäßig eine sehr kleine Stack-Trace-Größe haben. Viel Glück

    
Yaser Moradi 10.09.2013 21:25
quelle