2008-09-29 40 views
33

Tôi cố gắng để đọc một dòng phản ứng Http hai lần thông qua như sau:Làm cách nào để đọc luồng phản hồi của Http hai lần trong C#?

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
stream = response.GetResponseStream(); 
RssReader reader = new RssReader(stream); 
do 
{ 
    element = reader.Read(); 
    if (element is RssChannel) 
    { 
    feed.Channels.Add((RssChannel)element); 
    } 
} while (element != null); 

StreamReader sr = new StreamReader(stream); 
feed._FeedRawData = sr.ReadToEnd(); 

Tuy nhiên khi mã StreamReader thực hiện không có dữ liệu trả về bởi vì dòng hiện nay đã đạt kết thúc. Tôi đã cố gắng để thiết lập lại các dòng thông qua stream.Position = 0 nhưng điều này ném một ngoại lệ (tôi nghĩ vì dòng không thể có vị trí của nó thay đổi bằng tay).

Về cơ bản, tôi muốn phân tích luồng cho XML và có quyền truy cập vào dữ liệu thô (theo định dạng chuỗi).

Bất kỳ ý tưởng nào?

Trả lời

64

Sao chép nó vào một MemoryStream mới trước tiên. Sau đó, bạn có thể đọc lại các MemoryStream như nhiều lần như bạn muốn:

Stream responseStream = CopyAndClose(resp.GetResponseStream()); 
// Do something with the stream 
responseStream.Position = 0; 
// Do something with the stream again 


private static Stream CopyAndClose(Stream inputStream) 
{ 
    const int readSize = 256; 
    byte[] buffer = new byte[readSize]; 
    MemoryStream ms = new MemoryStream(); 

    int count = inputStream.Read(buffer, 0, readSize); 
    while (count > 0) 
    { 
     ms.Write(buffer, 0, count); 
     count = inputStream.Read(buffer, 0, readSize); 
    } 
    ms.Position = 0; 
    inputStream.Close(); 
    return ms; 
} 
+4

Một gợi ý nhỏ ở đây - Tôi thường thấy các cuộc gọi thì Cần đến sự hợp tài sản Chức vụ sẽ đơn giản hơn và dễ đọc hơn, ví dụ ms.Position = 0; Chỉ cần suy nghĩ về mã tương lai. –

+8

Một nhận xét khác - ở trên không kết thúc việc đóng luồng đến, bao giờ hết. Có thể đáng để tạo phương thức "CopyAndClose" * làm * đóng luồng, vì vậy bạn có thể giữ cú pháp gọi đơn giản. –

+0

Wow, đến gần các anh hùng của tôi .. Tôi hiện đang đọc sách của bạn, ông Skeet :-) Những gì bạn đề nghị về việc đóng (và nói với tên phương thức) chính xác là những gì tôi nghĩ về đoạn mã trên. – VVS

-1

bạn đã thử đặt lại vị trí luồng chưa? nếu điều này không hoạt động, bạn có thể sao chép luồng vào MemoryStream và tại đó bạn có thể đặt lại vị trí (tức là 0) bao nhiêu lần tùy thích.

+0

Ném lỗi không được hỗ trợ – ppumkin

Các vấn đề liên quan