我有一個查詢數據庫並返回JSON的WCF4 REST服務。儘管我很難返回字符串,但有些用戶希望做出非常大的查詢。例如,我需要返回一個500M JSON字符串(所有數據都是ASCII文本),但是當我嘗試從.NET的本機UTF-16轉換字符串時,我遇到了OutOfMemoryException。這是我正在做的一個簡潔的樣本。將大字符串轉換爲UTF-8
[WebInvoke(UriTemplate="/RunQuery", ResponseFormat=WebMessageFormat.Json)]
public Stream RunQuery() {
// Perform query and return serialized json string (~500 million ASCII characters)
string json = DoQuery(HttpContext.Current.Request.Form);
// Set output charset
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
// Convert UTF-16 string to UTF-8 (OutOfMemoryException)
byte jsonBytes[] = System.Text.Encoding.UTF8.GetBytes(json)
// Send UTF-8 string, without BOM
return new MemoryStream(jsonBytes);
}
如果我把JSON低於200M左右,它纔有效。當它運行時,我看到IIS進程的內存使用量逐漸增加,然後爆炸到2.8G,並在此時死亡。堆棧跟蹤報告它發生在System.String.ToCharArray。我嘗試了將字符串分塊來構建字節數組的變體,但似乎沒有任何工作。任何想法如何我可以發送這些數據而不用炸燬?
500M JSON?哎喲。難道你不能將數據分成頁面嗎? – 2012-01-27 20:33:40
只是一個猜測:你可以嘗試寫入響應數據到一個臨時文件塊,然後返回一個打開的流爲臨時文件? (最好你應該重新構造DoQuery(),以便它支持將其結果寫入輸出流而不是返回流。如果不需要,你實際上不應該緩存整個兆字節的數據。) – millimoose 2012-01-27 20:34:53
或將數據流傳回客戶端.... – Polity 2012-01-27 20:35:39