接收大数据时,ServiceStack会抛出StackOverflowException

时间:2013-09-10 13:44:03

标签: c# .net silverlight servicestack stack-overflow

我正在使用ServiceStack的JsonServiceClient和Silverlight 5从我的ASP.Net服务器接收JSON数据。它适用于简短的JSON字符串,但是当涉及到非常大量的数据时,ServiceStack.ServiceClient.Web.AsyncServiceClient.ReadCallBack<>中会抛出StackOverflowException。

所以我检查了GitHub上的最新源代码,并注意到数据是作为块4096 bytes从流中逐块读取的。问题是这个方法读取一个块并告诉流完成后递归调用自身。我们收到的数据越多,发生的递归调用就越多。这就是当接收到的数据太大时应用程序崩溃的原因。

想法:

  • 将方法重构为迭代而不是递归。对于所有这些有条件的回报,等待,尝试捕获等等,这似乎是一项艰巨的任务。
  • 增加块大小。我不知道4096是否有任何原因 在这里,所以我宁愿不单独这样做。

无论如何,在我下载所有源代码之前,我自己修改并编译它,我想听听你对此的看法。这是一个错误还是我使用它错了?

2 个答案:

答案 0 :(得分:1)

对于JSON响应,通过线路发送的字符串长度存在限制。在外部应用程序上,您可能永远不会达到默认限制。但是,在内部应用程序上,您可能会点击它,因为重量不是这样且问题。您需要在web.config文件中添加以下内容以最大化JSON字符串长度。

请注意,您无法将字符串长度设置为无限制。另外,我认为你不能超过2147483644。

<configuration> 
 <system.web.extensions>
   <scripting>
       <webServices>
           <jsonSerialization maxJsonLength="2147483644"/>
       </webServices>
   </scripting>
 </system.web.extensions>
</configuration> 

答案 1 :(得分:0)

您始终可以创建新线程并将堆栈大小传递给它的构造函数 这总是有效的 请注意,在某些情况下,例如ASP.NET开发,默认情况下堆栈跟踪大小非常小。 祝你好运