17

.NET WebRequest/WebResponse クラスを使用して Twitter ストリーミング API here にアクセスしようとしています"http://stream.twitter.com/spritzer.json"

接続を開き、開いている接続からデータを段階的に読み取ることができる必要があります。

現在、メソッドを呼び出すとWebRequest.GetResponse、応答全体がダウンロードされるまでブロックされます。メソッドがあることは知っていますがBeginGetResponse、これはバックグラウンド スレッドで同じことを行うだけです。ダウンロードがまだ行われている間に、応答ストリームにアクセスする必要があります。これは、これらのクラスでは不可能に思えます。

Twitterのドキュメントには、これに関する特定のコメントがあります。

「一部の HTTP クライアント ライブラリは、接続がサーバーによって閉じられた後にのみ応答本文を返すことに注意してください。これらのクライアントは、ストリーミング API へのアクセスには機能しません。応答データを段階的に返す HTTP クライアントを使用する必要があります。最も堅牢な HTTPクライアント ライブラリはこの機能を提供します。たとえば、Apache HttpClient はこのユース ケースを処理します。」

彼らは Appache HttpClient を指していますが、.NET を使用する必要があるため、あまり役に立ちません。

WebRequest/WebResponseでこれが可能かどうか、または低レベルのネットワーキングクラスに行く必要があるかどうかについてのアイデアはありますか? たぶん、これを可能にする他のライブラリがありますか?

Thxアレン

4

3 に答える 3

17

私は正常に動作するTcpClientを使用することになりました。ただし、これが WebRequest/WebResponse で可能かどうかを知りたいと思います。誰かが興味を持っている場合に備えて、私のコードは次のとおりです。

using (TcpClient client = new TcpClient())
{

    string requestString = "GET /spritzer.json HTTP/1.1\r\n";
    requestString += "Authorization: " + token + "\r\n";
    requestString += "Host: stream.twitter.com\r\n";
    requestString += "Connection: keep-alive\r\n";
    requestString += "\r\n";

    client.Connect("stream.twitter.com", 80);

    using (NetworkStream stream = client.GetStream())
    {
        // Send the request.
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(requestString);
        writer.Flush();

        // Process the response.
        StreamReader rdr = new StreamReader(stream);

        while (!rdr.EndOfStream)
        {
            Console.WriteLine(rdr.ReadLine());
        }
    }
}
于 2009-07-04T15:37:21.347 に答える
13

BeginGetResponseは必要なメソッドです。これにより、応答ストリームを段階的に読み取ることができます。

class Program
{
    static void Main(string[] args)
    {
        WebRequest request = WebRequest.Create("http://stream.twitter.com/spritzer.json");
        request.Credentials = new NetworkCredential("username", "password");
        request.BeginGetResponse(ar => 
        {
            var req = (WebRequest)ar.AsyncState;
            // TODO: Add exception handling: EndGetResponse could throw
            using (var response = req.EndGetResponse(ar))
            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                // This loop goes as long as twitter is streaming
                while (!reader.EndOfStream)
                {
                    Console.WriteLine(reader.ReadLine());
                }
            }
        }, request);

        // Press Enter to stop program
        Console.ReadLine();
    }
}

または、WebClientの方が使いやすい場合(個人的には WebRequest よりも好みます):

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential("username", "password");
    client.OpenReadCompleted += (sender, e) =>
    {
        using (var reader = new StreamReader(e.Result))
        {
            while (!reader.EndOfStream)
            {
                Console.WriteLine(reader.ReadLine());
            }
        }
    };
    client.OpenReadAsync(new Uri("http://stream.twitter.com/spritzer.json"));
}
Console.ReadLine();
于 2009-07-05T09:13:56.020 に答える
0

WebRequest.BeginGetRequestStream()を試しましたか?

またはこのようなもの:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create (http://www.twitter.com );
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream()); 

string str = reader.ReadLine();
while(str != null)
{
   Console.WriteLine(str);
   str = reader.ReadLine();
}
于 2009-07-04T09:36:08.970 に答える