HttpWebRequest初始化 – 从未收到响应

我目前正致力于应用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内容,但我无法获得二进制流。

有没有人遇到过这样的事情或知道是什么导致了它?

我不知道这是否适合你,但我有同样的问题,

并明确设置

request.AllowReadStreamBuffering = false; request.Method =“GET”;

无论出于何种原因似乎让我的回调开火……

我不知道为什么。

考虑到Shoutcast “HTTP”的优势特性,打开UseUnsafeHeaderParsing可能会有所帮助。

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

编辑

这看起来非常出色:可能需要将AllowReadStreamBuffering设置为false:

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

AllowReadStreamBuffering的默认设置为true 。 这意味着你永远不会回击,因为下载永远不会结束(并且留下足够长的时间,你可能会耗尽内存)。 将其设置为false