HttpWebRequest инициализация - ответ не получен - PullRequest
1 голос
/ 19 сентября 2010

В настоящее время я работаю над реализацией приложения для Windows Phone 7, которое должно получать поток SHOUTcast (вдохновлено этим вопросом ).Местоположение потока представлено IP-адресом и портом.

Вот пример URL-адреса потока SHOUTcast: http://78.159.104.183:80

Я пытаюсь создать HttpWebRequest для получения данных из потока:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://78.159.104.183:80");

После инициализации запроса я пытаюсь получить ответ через асинхронный обратный вызов:

request.BeginGetResponse(new AsyncCallback(GetShoutAsync), request);

GetShoutAsync выглядит следующим образом:

void GetShoutAsync(IAsyncResult res)
{
     HttpWebRequest request = (HttpWebRequest)res.AsyncState;
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(res);
}

Когда я собираю проект и запускаю его, он достигает точки инициализации запроса, но обратный вызов никогда не вызывается .

Я заметил интересную вещь - SHOUTcast реализуетметод, с помощью которого, когда пользователь пытается перейти к URL-адресу потока, сервер обнаруживает пользовательский агент и, если это веб-браузер, он просто показывает страницу HTML вместо передачи application / octet-stream content.

Вы по-прежнему можете получать поток напрямую, если используете косую черту и точку с запятой в конце URL-адреса потока: http://78.159.104.183:80/;

Однако в моем приложении я не могу получить ответ- кажется, что обратный вызовникогда не быть достигнутым.Я попытался подделать пользовательский агент, передав его непосредственно в HttpWebRequest:

request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8";

Это работает для простого потока URL (без точки с запятой в конце), чтобы получить содержимое HTML, но я не могу получить двоичный файлstream.

Кто-нибудь когда-либо сталкивался с чем-то подобным или знает, что его вызывает?

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Понятия не имею, сработает ли это для вас, но у меня была такая же проблема,

и явная настройка

request.AllowReadStreamBuffering = false; request.Method = "GET";

казалось, по какой-то причине заставил меня перезвонить в огонь ...

Я не уверен почему.

0 голосов
/ 19 сентября 2010

Это может помочь включить UseUnsafeHeaderParsing , учитывая нестабильную природу Shoutcast "HTTP" .

Работает ли ваш код, когда вы переключаете его на обычные веб-страницы?

EDIT

Это выглядит как превосходное преимущество: возможно, вам нужно установить AllowReadStreamBuffering в false:

Свойство AllowReadStreamBuffering влияет на то, когда вызывается метод обратного вызова из BeginGetResponse. Когда свойство AllowReadStreamBuffering равно true, обратный вызов вызывается после того, как весь поток был загружен в память. Когда свойство AllowReadStreamBuffering равно false, обратный вызов повышается, как только поток становится доступным для чтения, что может быть до того, как все данные поступят.

Значение по умолчанию для AllowReadStreamBuffering равно true. Это означает, что вы никогда не нажмете обратный вызов, потому что загрузка никогда не заканчивается (и если вы оставите ее достаточно долго, вам, вероятно, не хватит памяти). Установите false.

...