StreamReader ReadToEnd () после HttpWebRequest EndGetResponse () - наиболее масштабируемый? - PullRequest
1 голос
/ 19 января 2010

Я вызываю веб-службу RESTful в серверной части некоторых страниц ASP.NET.

Я использую асинхронные страницы ASP.NET, поэтому под капотом я использую методы:

HttpWebRequest BeginGetResponse ()

и

HttpWebRequest EndGetResponse ()

Строка ответа в моем случае всегда является строкой JSON. Я использую следующий код, чтобы прочитать всю строку:

using (StreamReader sr = new StreamReader(myHttpWebResponse.GetResponseStream()))
{
  myObject.JSONData = sr.ReadToEnd();
}

Этот метод в порядке с точки зрения масштабируемости? Я видел другие примеры кода, которые вместо этого получают данные ответа в блоках, используя Read (). Моя основная цель - масштабируемость, поэтому этот внутренний вызов может быть выполнен для множества одновременных обращений к страницам.

Спасибо, Frank

1 Ответ

0 голосов
/ 19 января 2010

Это зависит от того, что вы подразумеваете под "масштабируемым". Если вы говорите о возможности обрабатывать все большие и большие файлы, я бы сказал, что это не очень хорошо масштабируется. Поскольку вы используете один ReadToEnd, огромный поток потребует, чтобы весь поток был считан в память и затем обработан. По мере увеличения количества, сложности и размера потоков приложений вы обнаружите, что это начнет снижать производительность сервера для обработки запросов. Вы также можете обнаружить, что ваш пул приложений начнет перерабатывать себя В ТЕЧЕНИЕ вашего запроса (если вы в итоге заберете столько виртуальной памяти).

Если поток всегда будет небольшим, и вас интересует только количество созданных потоков, я не понимаю, почему это не будет масштабироваться, если ваши потоки зависят от открытых файлов, соединений с базой данных, и т.д.

...