【问题标题】:Returning a JSON stream from an ApiController从 ApiController 返回 JSON 流
【发布时间】:2012-11-07 10:55:35
【问题描述】:

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

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

我不想序列化为字符串然后返回字符串,因为我们可能要处理 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 字节的响应。有人可以指出我正确的方向吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 超时(亚秒级)太快了,不过感谢tracingf的建议,我会看看。
    【解决方案2】:

    事实证明这是我的一个愚蠢的错误...我没有刷新写入器并重置流位置...

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

    解决了问题

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2018-08-10
      • 2014-12-18
      • 1970-01-01
      • 2018-07-15
      • 2020-08-02
      相关资源
      最近更新 更多