Làm thế nào để chuyển đổi trả về WebResponse.GetResponseStream thành một chuỗi?


79

Tôi thấy nhiều ví dụ nhưng tất cả chúng đều đọc chúng thành các mảng byte hoặc 256 ký tự cùng một lúc, một cách chậm rãi. Tại sao?

Không nên chỉ chuyển đổi Streamgiá trị kết quả thành một chuỗi mà tôi có thể phân tích cú pháp nó?

Câu trả lời:


59

Bạn nên tạo StreamReaderxung quanh luồng, sau đó gọi ReadToEnd.

WebClient.DownloadStringThay vào đó bạn nên cân nhắc việc gọi điện .


1
Cảm ơn SLaks, hãy kiểm tra DownloadString ngay bây giờ. Trên thực tế, tôi nhận được các chuỗi mã nguồn khác nhau so với ứng dụng cũ của tôi, nơi nó sử dụng trình duyệt.DocumentStream sử dụng điều khiển Trình duyệt Winforms. Bạn nghĩ DownloadString sẽ khắc phục được nó? Tôi có thể tạo một câu hỏi mới nếu nó không đơn giản.
Joan Venge

5
Bạn có vấn đề về mã hóa hoặc bạn cần đặt User-Agent.
SLaks

Cảm ơn SLaks, tôi sử dụng DownloadString bây giờ, và tốt hơn là bạn đúng. Bây giờ kết quả hơi khác một chút, không nên tạo ra sự khác biệt nhưng tôi nhận được những thứ giống như <a href=thay vì cái cũ <A href=. Điều đó vẫn liên quan đến mã hóa hay User-Agentbạn nghĩ vậy?
Joan Venge

2
Nghe có vẻ kì lạ; nó có thể được chuẩn hóa bởi IE.
SLaks

3
WebClientHttpWebRequestsử dụng HTTP thô mà không liên quan đến trình duyệt. Nếu các trình duyệt khác nhau hiển thị các Nguồn Chế độ xem khác nhau , thì đó là một User-Agentvấn đề.
SLaks

141

Bạn có thể sử dụng StreamReader.ReadToEnd(),

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

1
@FaizanMubasher - Tôi muốn đề xuất LINQ To XML.
adatapost

2
Tuyệt vời mà bạn đã chỉ ra StreamReadercó tham số thứ hai Encoding.UTF8. Không thông báo rằng lúc đầu khi nhìn vào MS tài liệu
newprint

5
Không nên mã hóa dựa trên giá trị của response.CharacterSet thay vì giả định một giá trị cố định của UTF8?
Heinzi

LINQ Đến mẫu XML?
PreguntonCojoneroCabrón

GetResponse and GetResponseStreamcó thể ném ngoại lệ
PreguntonCojoneroCabrón

10

Như @Heinzi đã đề cập, nên sử dụng bộ ký tự của phản hồi.

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

Richard Schneider đã đúng. sử dụng mã bên dưới để tìm nạp dữ liệu từ trang web không phải là bộ mã utf8 sẽ nhận được chuỗi sai.

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

"Tôi không thể bỏ phiếu. vì vậy đã viết điều này.


3

Bạn có thể tạo StreamReaderxung quanh luồng, sau đó gọi điện StreamReader.ReadToEnd().

StreamReader responseReader = new StreamReader(request.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.