HttpWebRequest.BeginGetResponse完成得太晚了

时间:2011-07-12 07:37:36

标签: windows-phone-7 httpwebrequest progress

我在我的代码中使用HttpWebRequest.BeginGetResponse()方法来从我的服务器获取数据。服务器生成的内容范围可以从几KB到几GB。

我的问题是HttpWebRequest.BeginGetResponse完成得太晚了。它应该在建立与服务器的连接并收到HTTP标头后立即完成。

以下是使用GET方法的示例代码:

public bool StartDownload()
{
    try
    {
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(m_getUrl);
        myHttpWebRequest.Method = "GET";

        // Start the asynchronous request.
        m_requestState = new RequestState();
        m_requestState.request = myHttpWebRequest;

        myHttpWebRequest.BeginGetResponse(new AsyncCallback(ResponseCompleted), m_requestState);
    }
    catch (Exception)
    {
        m_requestState = null;
    }

    return m_requestState != null;
}

private void ResponseCompleted(IAsyncResult result)
{
    RequestState myRequestState = (RequestState)result.AsyncState;
    HttpWebRequest myHttpWebRequest = myRequestState.request;

    m_logger.LogMessage("ResponseCompleted notification received!");

    HttpWebResponse response = null;
    try
    {
        response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result);
    }
    catch (Exception)
    {
    }
    .......
}

我使用“http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.1.tar.bz2”运行代码,结果如下:

hh:mm:ss.ms
12:51:30.9440000 - Download started!
12:53:04.8520000 - ResponseCompleted notification received!
12:53:04.8560000 - Header received!
12:53:04.8570000 - DataReceived: 524288 bytes
.........................................
12:53:04.8940000 - DataReceived: 78818 bytes
12:53:04.8940000 - Request data received!
12:53:04.8940000 - Received bytes: 76100578

可以在日志中轻松检测到该问题。连接花费的时间超过一分钟,下载时间不超过38毫秒,大约72.5 MB。 似乎数据是在手机上的某个地方下载的,只有在本地提供完整内容时才会将RequestComplete通知发送到应用程序。这对我来说不合适,因为我需要显示操作的进度。

我在WP7的设备和模拟器上得到了相同的结果(也在WP7.1上)。

我在Windows桌面上运行相同的代码并且运行正常:请求在一秒钟内完成,其余的下载大约需要1-2分钟。

WP7或WP 7.1有什么解决方案吗? 新推出的WP 7.1 API“后台文件传输”没有帮助,因为我需要完全控制HTTP头和内容。并非我对服务器发出的所有HTTP请求都会将文件作为输出生成。

谢谢! 米哈伊

1 个答案:

答案 0 :(得分:3)

如果要向下传输数据,则需要禁用响应缓冲。您可以将AllowReadStreamBuffering设置为false

HttpWebRequest myHttpWebRequest = WebRequest.CreateHttp(m_getUrl);
myHttpWebRequest.Method = "GET";
myHttpWebRequest.AllowReadStreamBuffering = false;