3

MVCApiControllerから返す必要のある大きなJSONオブジェクトがあります。

シリアル化されたコンテンツの内部シリアライザーバーフが長すぎるため、JSONオブジェクトを単純に返すことはできません。

5〜6 MBのデータを処理する可能性があるため、文字列にシリアル化してから文字列を返すことはしたくありません。これは、目的のないメモリの浪費のようです。

私がやりたいのは、NewtonsoftJSONシリアライザーを使用して応答ストリームに直接書き込むことです。

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バイトの応答を受け取ります。誰かが私を正しい方向に向けてくれませんか?

4

2 に答える 2

1

web.config / machine.configでタイムアウト設定を確認してみましたか?たぶんIISは、Response.Contentを取得するのに時間がかかりすぎると判断します。

とにかく、トレースを使用して失敗したリクエストでこの問題を確認する必要があります-それはあなたを正しい方向に向けるはずです。

于 2012-11-09T08:33:05.433 に答える
1

これは私の側のばかげた間違いだったことがわかりました...私はライターをフラッシュしてストリームの位置をリセットしていませんでした...

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

問題を解決しました

于 2012-12-01T04:18:24.000 に答える