Класс HttpClient в System.Web.Http доступен с версии .Net 4.5.Вы должны работать с асинхронным кодом, но это неплохая идея, если вы работаете с Интернетом.
В качестве примера данных я буду использовать список"todo" jsonplaceholder.Он предоставляет данные JSON, а не данные CSV, но он дает достаточно простую структуру, которая может служить нашей цели в приведенном ниже примере.
Это основная функция, которая извлекается из jsonplaceholder аналогично вашему сайту «testWebService123», хотя я только получаю первые 3 задачи, в отличие от тестирования, когда я нажимаю на последнююстраницы (вы бы, вероятно, сохранили свою работу) на этом.
async void DownloadPagesAsync() {
for (var i = 1; i < 3; i++) {
var pageToGet = $"https://jsonplaceholder.typicode.com/todos/{i}";
using (var client = new HttpClient())
using (HttpResponseMessage response = await client.GetAsync(pageToGet))
using (HttpContent content = response.Content)
using (var stream = (MemoryStream) await content.ReadAsStreamAsync())
using (var sr = new StreamReader(stream))
while (!sr.EndOfStream) {
var row =
sr.ReadLine()
.Replace(@"""", "")
.Replace(",", "");
if (row.IndexOf(":") == -1)
continue;
var values = row.Split(':');
Console.WriteLine($"{values[0]}, {values[1]}");
}
}
}
Вот как вы бы вызывали функцию, например, как в методе Main ():
Task t = new Task(DownloadPagesAsync);
t.Start();
Новая задача, которая здесь выполняется, - это "действие"или, или другими словами, функция, которая возвращает void, в качестве параметра.Затем вы начинаете задание.Будьте осторожны, он асинхронный, поэтому любой код, который вы имеете после t.Start (), может очень хорошо выполнить до того, как ваша задача завершится.
Что касается вашего вопроса относительно того, читает ли поток «в памяти» или нет,запуск GetType () для «потока» в коде привел к типу «MemoryStream», хотя он, кажется, распознается как объект «Stream» только во время компиляции.MemoryStream определенно находится в памяти.Я не совсем уверен, сохранит ли какой-нибудь другой вид потоковых объектов временные файлы за кулисами, но я склоняюсь не к этому.
Но, хотя вы и заслуживаете похвалы, внутренняя работа класса, как правило, не требуется для вашего беспокойства об утилизации.Для любого класса просто посмотрите, реализует ли он IDisposable.Если это так, вставьте оператор «using», как вы это делали в своем коде.Когда программа завершается, как и ожидалось, или из-за ошибки, программа выполнит правильное удаление после того, как управление выйдет из блока «using».
HttpClient - фактически более новый подход.Из того, что я понимаю, он не заменяет все функциональные возможности WebClient, но во многих отношениях он сильнее.См. этот SO-сайт для более подробной информации по сравнению двух классов.
Кроме того, кое-что, что нужно знать о WebClient, это то, что он может быть простым, но ограничивающим.Если вы столкнетесь с проблемами, вам нужно будет обратиться к классу HttpWebRequest, который является классом «более низкого уровня», который дает вам более широкий доступ к основным моментам (таким как работа с файлами cookie).