#.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