我目前正致力于应用Windows Phone 7的应用程序,该应用程序应检索SHOUTcast流(受this question启发)。流位置由IP地址和端口表示。
以下是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时,服务器会检测用户代理,如果是Web浏览器,它只会显示HTML页面而不是传递 application / octet-stream 内容。
如果您在流网址末尾使用斜杠和分号,您仍然可以直接接收流: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内容,但我无法获得二进制流。
任何人都遇到过这样的事情或者知道是什么导致了它?
答案 0 :(得分:1)
我不知道这对你有用,但我有同样的问题,
并明确设置
request.AllowReadStreamBuffering = false; request.Method =“GET”;
无论出于什么原因,我的回调都会被解雇......
我不确定为什么。
答案 1 :(得分:0)
考虑到Shoutcast “HTTP”的灵活性,开启UseUnsafeHeaderParsing可能会有所帮助。
将代码转换为普通网页时,您的代码是否有效?
修改
这看起来非常出色:可能需要将AllowReadStreamBuffering
设置为false:
AllowReadStreamBuffering
属性会影响何时调用BeginGetResponse
方法的回调。当AllowReadStreamBuffering
属性为true
时,一旦将整个流下载到内存中,就会引发回调。当AllowReadStreamBuffering
属性为false
时,只要流可供读取,就会在所有数据到达之前立即引发回调。
AllowReadStreamBuffering
的默认设置为true
。这意味着你永远不会回击,因为下载永远不会结束(并且留下足够长的时间,你可能会耗尽内存)。将其设置为false
。