我有一个WCF4 REST服务,它查询数据库并返回JSON。一些用户想要进行非常大的查询,但是我很难返回这么长的字符串。例如,我需要返回一个500M的JSON字符串(所有数据都是ASCII文本),但当我尝试从.NET的本机UTF-16转换字符串时,会出现OutOfMemoryException异常。以下是我正在做的紧凑示例。
[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处。我尝试了将字符串分块以构建字节数组的各种变体,但似乎没有任何作用。有什么办法可以在不崩溃的情况下发送这些数据?