HttpWebRequest初始化 - 从未收到响应

时间:2010-09-19 17:07:02

标签: c# .net httpwebrequest windows-phone-7 httpwebresponse

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

任何人都遇到过这样的事情或者知道是什么导致了它?

2 个答案:

答案 0 :(得分:1)

我不知道这对你有用,但我有同样的问题,

并明确设置

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

无论出于什么原因,我的回调都会被解雇......

我不确定为什么。

答案 1 :(得分:0)

考虑到Shoutcast “HTTP”的灵活性,开启UseUnsafeHeaderParsing可能会有所帮助。

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

修改

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

  

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

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