【问题标题】:HttpWebRequest initializing - response never receivedHttpWebRequest 初始化 - 从未收到响应
【发布时间】:2010-09-19 17:07:02
【问题描述】:

我目前正在为 Windows Phone 7 实现一个应用程序,该应用程序应该检索 SHOUTcast 流(受 this question 启发)。流位置由 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-stream 内容。

如果您在流 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 内容,但我无法获取二进制流。

有人遇到过这样的事情或知道是什么原因造成的吗?

【问题讨论】:

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


    【解决方案1】:

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

    并明确设置

    request.AllowReadStreamBuffering = false; request.Method = "GET";

    似乎不知什么原因让我的回调触发...

    我不知道为什么。

    【讨论】:

      【解决方案2】:

      考虑到 Shoutcast "HTTP" 的脆弱性质,打开 UseUnsafeHeaderParsing 可能会有所帮助。

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

      编辑

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

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

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

      【讨论】:

      • 是的,它适用于普通网页。附带说明,UseUnsafeHeaderParsing 在 Windows Phone 7 上不可用。
      • 没有例外?假设您尝试 WebRequest 的同步对应项?它只是挂起吗?
      • 没有例外。不,它不会挂起应用程序——它只是从不执行回调中的代码。
      • 对不起,我的意思是如果你同步做事情而不是异步回调,代码会挂起、抛出还是继续?它可能会为异步版本的问题所在提供线索。
      • 对于 Windows Phone 7 应用程序,您无法通过 WebRequest 或 HttpWebRequest 同步下载数据 - 只有异步调用可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      相关资源
      最近更新 更多