我在我的代码中使用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请求都会将文件作为输出生成。
谢谢! 米哈伊
答案 0 :(得分:3)
如果要向下传输数据,则需要禁用响应缓冲。您可以将AllowReadStreamBuffering设置为false
。
HttpWebRequest myHttpWebRequest = WebRequest.CreateHttp(m_getUrl);
myHttpWebRequest.Method = "GET";
myHttpWebRequest.AllowReadStreamBuffering = false;