1

我目前正在为 Windows Phone 7 实现一个应用程序,该应用程序应该检索 SHOUTcast 流(受这个问题的启发)。流位置由 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 页面而不是传递application/octet -流内容。

如果在流 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可能会有所帮助。

当您将代码转到普通网页时,您的代码是否有效?

编辑

这看起来是一个很好的线索:也许你需要设置AllowReadStreamBuffering为 false:

AllowReadStreamBuffering属性影响调用BeginGetResponse 方法的回调的时间。当AllowReadStreamBuffering 属性为true时,一旦将整个流下载到内存中,就会引发回调。当AllowReadStreamBuffering属性为false时,一旦流可用于读取,就会引发回调,这可能是在所有数据到达之前。

的默认设置AllowReadStreamBufferingtrue。这意味着您永远不会遇到回调,因为下载永远不会结束(并且离开的时间足够长,您可能会耗尽内存)。将其设置为false

于 2010-09-19T17:16:49.777 回答