首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ApiController返回JSON流

从ApiController返回JSON流
EN

Stack Overflow用户
提问于 2012-11-07 10:55:35
回答 2查看 2.4K关注 0票数 3

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

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

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

我想要做的是使用Newtonsoft JSON序列化程序直接写入响应流。

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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字节的响应。谁能帮我指出正确的方向吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-01 04:18:24

原来这是我的一个愚蠢的错误..。我不是冲作家和重置溪流位置..。

代码语言:javascript
复制
JsonWriter.Flush()
MemoryStream.Seek(0, StreamPosition.Beginning)

解决了这个问题

票数 1
EN

Stack Overflow用户

发布于 2012-11-09 08:33:05

您试过检查web.config/machine.config中的超时设置吗?也许IIS认为获得Response.Content所花费的时间太长了。

无论如何,你应该用使用跟踪失败的请求来检查这个问题--这应该会给你指明正确的方向。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13268237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档