У меня есть служба WCF4 REST, которая запрашивает базу данных и возвращает JSON. Некоторые пользователи хотят делать очень большие запросы, хотя у меня возникают трудности с возвратом строки. Например, мне нужно вернуть 500-метровую строку JSON (все данные - текст ASCII), хотя, когда я пытаюсь преобразовать строку из нативного UTF-16 .NET, я нажимаю исключение 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. Я пробовал варианты разбиения строки на части для создания байтового массива, но, похоже, ничего не работает. Любая идея, как я могу отправить эти данные без взрыва?