servicestack,Asp.net,Iis,servicestack" /> servicestack,Asp.net,Iis,servicestack" />

Asp.net ServiceStack转换对CompressedResult的响应抛出OutOfMemoryException

Asp.net ServiceStack转换对CompressedResult的响应抛出OutOfMemoryException,asp.net,iis,servicestack,Asp.net,Iis,servicestack,我使用ServiceStacks的内置ToOptimizedResult方法压缩json数据。这已经很好地工作了一段时间了,但是最近,当返回的数据是高(50k+)行时,我得到了下面的内存错误: System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.Text.StringBuilder.ToString() at ServiceStack.Text.Jso

我使用ServiceStacks的内置ToOptimizedResult方法压缩json数据。这已经很好地工作了一段时间了,但是最近,当返回的数据是高(50k+)行时,我得到了下面的内存错误:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Text.StringBuilder.ToString()
at ServiceStack.Text.JsonSerializer.SerializeToString(Object value, Type type)
at ServiceStack.Text.JsonSerializer.SerializeToString[T](T value)
at ServiceStack.ServiceModel.Serialization.JsonDataContractSerializer.SerializeToString[T](T obj)
at ServiceStack.Common.Web.HttpResponseFilter.SerializeToString(IRequestContext requestContext, Object response)
at ServiceStack.ServiceHost.RequestContextExtensions.ToOptimizedResult[T](IRequestContext requestContext, T dto)
at MyService.post(PostDDSReportDataSourceData Input) in MyService.vb:line 452
at lambda_method(Closure , Object , Object )
at ServiceStack.ServiceHost.ServiceRunner`1.Execute(IRequestContext requestContext, Object instance, TRequest request)

奇怪的是,完全相同的数据在Dev上被序列化,而错误只出现在生产中。我在网上看到的主要解决方案建议禁用缓冲,但我只看到了完全禁用整个应用程序缓冲的示例。我怎么能只为一个请求禁用缓冲呢?

最终我自己解决了这个问题。在该方法中,只需按如下方式关闭缓冲:

CType(MyBase.Response.OriginalResponse, System.Web.HttpResponse).BufferOutput = False
作为上述解决方案的补充,如果将json字符串存储在变量中,您仍然会收到此错误。返回结果时仅调用ToOptimized方法。如果将序列化字符串存储在变量中,则关闭缓冲不会产生任何影响

我最终将列表序列化为一个文件,然后通过返回下面的HttpResult向下发送该文件:

Dim PathToTheSerializedJsonFile as String = "C:\SomeFile.Json"

Using fl As StreamWriter = File.CreateText(PathToTheSerializedJsonFile)
  Dim Serr As New Newtonsoft.Json.JsonSerializer()
  Serr.Serialize(fl, Input)
End Using

Return New HttpResult(New FileInfo(PathToTheSerializedJsonFile),asAttachment:=True)