WebRequest.GetResponse завершает метод без исключения

#.net #httpwebrequest

#.net #httpwebrequest

Вопрос:

Я извлекаю некоторые данные из Twitter, используя приведенный ниже код

         Dim FilterData = "follow=13,15"
        Dim Request As WebRequest = HttpWebRequest.Create("https://stream.twitter.com/1/statuses/filter.json")
        Request.ContentType = "application/x-www-form-urlencoded"
        Request.Method = "POST"
        Request.Credentials = New NetworkCredential("<Username>", "<Password>")
        Request.ContentLength = FilterData.Length

        Dim RequestStream = Request.GetRequestStream()
        Dim RequestWriter As New StreamWriter(RequestStream)
        RequestWriter.Write(FilterData)
        RequestWriter.Close()

        ' Get the response.
        Dim Response As WebResponse = Request.GetResponse()
        Console.Writeline("Reached")
 

Если я помещаю точку останова в Request.GetResponse() строку, все, что до нее, выполняется нормально, однако следующая строка никогда не попадает — и ни один обработчик исключений. Я не вижу никаких исключений первого шанса в окне вывода.

Этот вызов выполняется в рабочем потоке, поэтому приложение продолжает работать, но этот рабочий не делает ничего другого.

Может кто-нибудь указать на ошибку?

Ответ №1:

Вы пытаетесь получить доступ к потоковому API. Потоковые API-интерфейсы не указывают заголовок ответа длиной содержимого. Они непрерывно записывают ответ. Поэтому вы должны использовать асинхронный API для доступа к нему. Например, вы могли бы использовать WebClient:

 class Program
{
    static void Main()
    {
        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("https://stream.twitter.com/1/statuses/filter.json?follow=12,13"));
        }
        Console.ReadLine();
    }
}
 

и VB.NET эквивалент:

 Sub Main()
    Dim client = New WebClient()
    client.Credentials = New NetworkCredential("username", "password")
    AddHandler client.OpenReadCompleted, Sub(sender, e)
        Using reader = New StreamReader(e.Result)
            While Not reader.EndOfStream
                Console.WriteLine(reader.ReadLine())
            End While
        End Using
    End Sub
    client.OpenReadAsync(New Uri("https://stream.twitter.com/1/statuses/filter.json?follow=12,13"))
    Console.ReadLine()
End Sub