2012-11-07 43 views
3

我有一個 JSON對象,我需要從MVC ApiController返回。從ApiController返回JSON流

我不能簡單地返回JSON對象作爲序列化內容上的內部串行器barfs過長。

我不想序列化爲字符串,然後返回字符串,因爲我們可能會處理5-6MB的數據,這似乎是無用的內存浪費。

我想要做的就是使用Newtonsoft JSON串行器直接寫入響應流。

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字節的響應來代替。有人可以請指點我正確的方向嗎?

回答

1

事實證明,這是我的一個愚蠢的錯誤......我不沖水的作家和重置流位置...

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

問題解決了

1

您是否嘗試過檢查web.config/machine.config中的超時設置?也許IIS決定獲取Response.Content時間太長。

無論如何,你應該檢查這個問題與Failed Requests Using Tracing - 這應該指向你在正確的方向。

+0

這是太快是一個超時(亞秒)感謝tracingf的建議,但我會看看。 – Basic