Як перетворити повернення WebResponse.GetResponseStream у рядок?


79

Я бачу багато прикладів, але всі вони повільно читають їх у байтові масиви або 256 символів. Чому?

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

Відповіді:


59

Ви повинні створити StreamReaderнавколо потоку, а потім зателефонувати ReadToEnd.

WebClient.DownloadStringЗамість цього вам слід зателефонувати .


1
Дякую SLaks, перевіряючи DownloadString зараз. Насправді я отримую різні рядки вихідного коду порівняно зі своїм старим додатком, де він використовує браузер.DocumentStream за допомогою керування браузером Winforms. Ви думаєте, DownloadString це виправило б? Я можу створити нове запитання, якщо це не так просто.
Джоан Венге,

5
У вас або проблема з кодуванням, або вам потрібно встановити User-Agent.
Слакс

Дякую SLaks, я зараз використовую DownloadString, і краще, що ти маєш рацію. Зараз результат дещо відрізняється, не має значення, але я отримую такі речі, як <a href=замість старої, яка була <A href=. Це все ще пов’язано з кодуванням, чи User-Agentви думаєте?
Джоан Венге

2
Це звучить дивно; це може бути нормалізовано IE.
Слакс

3
WebClientі HttpWebRequestвикористовувати сирий HTTP без задіяного браузера. Якщо різні браузери показують різні джерела перегляду , це User-Agentпроблема.
Слакс

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

2
Чудово, що ви вказали, що StreamReaderбере другий параметр Encoding.UTF8. Спочатку не помітив, що під час перегляду документації MS
новий друк

5
Чи не повинно кодування базуватися на значенні response.CharacterSet, а не на припущенні фіксованого значення UTF8?
Хайнзі,

Посилання на зразок 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.