Как преобразовать возврат WebResponse.GetResponseStream в строку?

79

Я вижу много примеров, но все они медленно читают их в байтовые массивы или 256 символов за раз. Почему?

Разве не желательно просто преобразовать полученное Streamзначение в строку, где я могу его проанализировать?

Джоан Венге
источник

Ответы:

59

Вы должны создать StreamReaderвокруг ручья, затем позвонить ReadToEnd.

WebClient.DownloadStringВместо этого вам следует подумать о том, чтобы позвонить .

SLaks
источник
1
Спасибо, SLaks, сейчас проверяю DownloadString. На самом деле я получаю разные строки исходного кода по сравнению с моим старым приложением, где он использует browser.DocumentStream с использованием элемента управления Winforms Browser. Думаете, DownloadString это исправит? Я могу создать новый вопрос, если он не такой простой.
Joan Venge
5
У вас либо проблема с кодировкой, либо вам нужно установить файл User-Agent.
SLaks
Спасибо SLaks, сейчас я использую DownloadString, и лучше, что вы правы. Теперь результат немного отличается, это не должно иметь значения, но я получаю что-то вроде <a href=того, что было раньше <A href=. Это все еще связано с кодировкой или User-Agentвы думаете?
Joan Venge
2
Звучит странно; это может быть нормализовано IE.
SLaks
3
WebClientи HttpWebRequestиспользовать чистый HTTP без участия браузера. Если в разных браузерах отображаются разные источники просмотра , это User-Agentпроблема.
SLaks
141

Вы можете использовать StreamReader.ReadToEnd(),

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}
адатапост
источник
1
@FaizanMubasher - Я хотел бы предложить LINQ To XML.
adatapost 01
2
Отлично, что вы указали, StreamReaderпринимает второй параметр Encoding.UTF8. Не заметил этого сначала при просмотре документации MS
газета 01
5
Разве кодировка не должна основываться на значении response.CharacterSet, а не на фиксированном значении UTF8?
Heinzi
Пример LINQ To XML?
PreguntonCojoneroCabrón
GetResponse and GetResponseStreamможет выдавать исключения
PreguntonCojoneroCabrón
10

Как упомянул @Heinzi, следует использовать набор символов ответа.

var encoding = response.CharacterSet == ""
    ? Encoding.UTF8
    : Encoding.GetEncoding(response.CharacterSet);

using (var stream = response.GetResponseStream())
{
    var reader = new StreamReader(stream, encoding);
    var responseString = reader.ReadToEnd();
}
Ричард Шнайдер
источник
5

Ричард Шнайдер прав. используйте приведенный ниже код для получения данных с сайта, который не является кодировкой utf8, получит неправильную строку.

using (Stream stream = response.GetResponseStream())
{
   StreamReader reader = new StreamReader(stream, Encoding.UTF8);
   String responseString = reader.ReadToEnd();
}

"Я не могу голосовать. Так написал это.

Говард Лу
источник
3

Можно создать StreamReaderвокруг ручья, потом позвонить StreamReader.ReadToEnd().

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
Мари
источник