从ApiController返回JSON流

时间:2012-11-07 10:55:35

标签: asp.net-mvc vb.net json streaming json.net

我有一个大型 JSON对象,我需要从MVC ApiController返回。

我不能简单地返回JSON对象,因为序列化内容上的内部序列化程序barfs太长了。

我不想序列化为字符串然后返回字符串,因为我们可能会处理5-6MB的数据,这似乎是浪费内存而无目的。

我想要做的是使用Newtonsoft JSON Serializer直接写入响应流。

Dim Ret = Client.Search(Model) ''Get the results object
Dim Response As New HttpResponseMessage()
Using MemoryStream As New IO.MemoryStream
    Using StreamWriter As New StreamWriter(MemoryStream)
        Using JsonWriter As JsonWriter = New JsonTextWriter(StreamWriter)
            Dim Serializer As New JsonSerializer
            Serializer.Serialize(JsonWriter, Ret)
        End Using
    End Using
    Response.Content = New StreamContent(MemoryStream)
    Return Response
End Using

不幸的是,这导致连接被意外重置 - 我猜这是因为流在完成发送结果之前被丢弃了?

即使我删除所有Using块,只留下GC的所有内容:

Dim Ret = Client.Search(Model)
Dim Response As New HttpResponseMessage()
Dim MemoryStream As New IO.MemoryStream
Dim StreamWriter As New StreamWriter(MemoryStream)
Dim JsonWriter As JsonWriter = New JsonTextWriter(StreamWriter)
Dim Serializer As New JsonSerializer
Serializer.Serialize(JsonWriter, Ret)
Response.Content = New StreamContent(MemoryStream)
Return Response

我得到一个0字节的响应。有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

您是否尝试过检查web.config / machine.config中的超时设置?也许IIS认为获取Response.Content需要太长时间。

无论如何,您应该使用Failed Requests Using Tracing检查此问题 - 这应该指向正确的方向。

答案 1 :(得分:1)

事实证明这对我来说是一个愚蠢的错误......我没有冲洗作家并重置流的位置......

JsonWriter.Flush()
MemoryStream.Seek(0, StreamPosition.Beginning)

解决了问题