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


79

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

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

Ответы:


59

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

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


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