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
。