2009-04-22 4 views
7

Tôi đang cố gắng tìm ra cách tốt nhất để tiêu thụ một luồng dữ liệu XML liên tục từ một dịch vụ đang gửi dữ liệu dưới dạng nguồn cấp dữ liệu "liên tục" qua HTTP.C# - Cách đọc một luồng XML liên tục qua HTTP

Tôi đã cân nhắc việc sử dụng HttpWebRequest/Response nhưng tôi không chắc chắn cách thức đó sẽ hoạt động nếu dữ liệu chỉ liên tục phát trực tuyến.

Mọi suy nghĩ?

Trả lời

9

Tôi đã làm điều này trước đây, không phải với XML, nhưng với dữ liệu cần được phân tích cú pháp để thay đổi trạng thái cho một ứng dụng. Phương thức HttpWebResponse.GetResponseStream() đã làm việc tốt cho việc này. Đảm bảo gọi Close() trên luồng này khi bạn hoàn tất. Tôi đề nghị một khối cuối cùng.

HttpWebRequest req; 

try 
{ 
    req = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
    Stream stream = req.GetResponseStream(); 

    byte[] data = new byte[4096]; 
    int read; 
    while ((read = data.Read(data, 0, data.Length)) > 0) 
    { 
     Process(data, read); 
    } 
} 
finally 
{ 
    if (req != null) 
     req.Close(); 
} 

Hoặc cách khác:

HttpWebRequest req; 

try 
{ 
    req = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
    Stream stream = req.GetResponseStream(); 

    XmlTextReader reader = new XmlTextReader(stream); 

    while (reader.Read()) 
    { 
     switch (reader.NodeType) 
     { 
     case XmlNodeType.Element: 
      Console.Write("<{0}>", reader.Name); 
      break; 
     case XmlNodeType.Text: 
      Console.Write(reader.Value); 
      break; 
     case XmlNodeType.CDATA: 
      Console.Write("<![CDATA[{0}]]>", reader.Value); 
      break; 
     case XmlNodeType.ProcessingInstruction: 
      Console.Write("<?{0} {1}?>", reader.Name, reader.Value); 
      break; 
     case XmlNodeType.Comment: 
      Console.Write("<!--{0}-->", reader.Value); 
      break; 
     case XmlNodeType.XmlDeclaration: 
      Console.Write("<?xml version='1.0'?>"); 
      break; 
     case XmlNodeType.Document: 
      break; 
     case XmlNodeType.DocumentType: 
      Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); 
      break; 
     case XmlNodeType.EntityReference: 
      Console.Write(reader.Name); 
      break; 
     case XmlNodeType.EndElement: 
      Console.Write("</{0}>", reader.Name); 
      break; 
     }  

    }  
} 
finally 
{ 
    if (req != null) 
     req.Close(); 
} 
+3

Tôi nghĩ rằng có một số chỉnh sửa nhỏ cần thiết để làm cho mã hoạt động. Không có phương thức 'HttpWebRequest.GetResponseStream()'. Bạn cần nhận một đối tượng 'HttpWebResponse' bằng cách sử dụng' HttpWebRequest.GetResponse() 'và gọi' GetResponseStream() 'trên đó. Cũng trong khối 'cuối cùng'' req' không được sử dụng nhưng câu trả lời được đề cập ở trên là 'Response'. – scherand

+0

đồng ý, tôi chỉ cần gõ nó ra khỏi bộ nhớ, không phải từ một dự án thực tế. – esac

+0

Làm cách nào để làm việc với XML? XML sẽ không hợp lệ cho đến khi toàn bộ tài liệu xml được tải xuống, loại đánh bại mục đích phát trực tuyến. – swestner

2

nên có thể làm điều đó khá dễ dàng. Bạn sẽ cần nhận luồng phản hồi bằng cách gọi Response.GetResponseStream() và sau đó sử dụng phản hồi async ResponseStream.BeginRead() trong một vòng lặp.

Không có cài đặt Thời gian chờ trên Trả lời nhưng nếu bạn liên tục nhận được dữ liệu đã gửi thì sẽ ổn thôi.