1

私は現在、SHOUTcast ストリームを取得する必要がある Windows Phone 7 用のアプリケーションの実装に取り​​組んでいます (この質問に触発されました)。ストリームの場所は、IP アドレスとポートで表されます。

SHOUTcast ストリーム URL の例を次に示します: 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 に移動しようとすると、サーバーがユーザー エージェントを検出し、それが Web ブラウザーの場合、アプリケーション/オクテットを渡す代わりに HTML ページを表示するだけの手法を実装しています。 -ストリームコンテンツ。

ストリーム 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 コンテンツを取得するために機能しますが、バイナリ ストリームを取得できません。

このようなことに遭遇したことのある人、または何が原因か知っている人はいますか?

4

2 に答える 2

1

これがうまくいくかどうかはわかりませんが、同じ問題がありました。

および明示的に設定する

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

なんらかの理由でコールバックが起動するように見えました...

理由はわかりません。

于 2010-10-21T02:52:40.153 に答える
0

Shoutcast "HTTP"の不安定な性質を考えると、 UseUnsafeHeaderParsingをオンにすると役立つ場合があります。

コードを通常の Web ページに変換すると、コードは機能しますか?

編集

これは優れたリードのように見えます: おそらくAllowReadStreamBufferingfalse に設定する必要があります:

プロパティは、メソッドからのコールバック が呼び出されるAllowReadStreamBufferingときに影響します。 プロパティがBeginGetResponseの場合、ストリーム全体がメモリにダウンロードされると、コールバックが発生します。プロパティがの場合、すべてのデータが到着する前に、ストリームが読み取り可能になるとすぐにコールバックが発生します。AllowReadStreamBufferingtrueAllowReadStreamBufferingfalse

のデフォルト設定はAllowReadStreamBufferingですtrue。これは、ダウンロードが終了しないため、コールバックにヒットしないことを意味します (十分に長く放置すると、おそらくメモリ不足になります)。に設定しfalseます。

于 2010-09-19T17:16:49.777 に答える