簡體   English   中英

C# - 如何通過HTTP讀取連續的XML流

[英]C# - How to read a continuous stream of XML over HTTP

我試圖找出從服務中獲取連續XML數據流的最佳方法,該服務將數據作為“常量”Feed通過HTTP發送。

我正在考慮使用HttpWebRequest / Response但我不確定如果數據只是連續流式傳輸會如何表現。

有什么想法嗎?

我之前已經完成了這項工作,不是使用XML,而是需要針對應用程序的狀態更改解析數據。 HttpWebResponse.GetResponseStream()方法對此工作正常。 完成后,請務必在此流上調用Close()。 我建議最終阻止。

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();
}

或者,或者:

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();
}

應該能夠相當容易地做到這一點。 您需要通過調用Response.GetResponseStream()獲取響應流,然后在循環中使用異步ResponseStream.BeginRead()。

響應中沒有超時設置,但如果您一直收到數據,那么應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM