Silverlight只发出一个http请求
本文关键字:一个 http 请求 Silverlight | 更新日期: 2023-09-27 18:00:12
我正在开发一个Silverlight应用程序,该应用程序生成Http请求,并从web服务器上传zip文件。zip文件每n分钟从web服务器中提取一次,这种行为由计时器控制。
我尝试过使用WebClient
和HttpWebRequest
类,但结果相同。请求仅在第一次到达web服务器。第二,第三。。。,发送请求和响应的时间。但是,请求从未到达web服务器。。。
void _timer_Tick(object sender, EventArgs e)
{
try
{
HttpWebRequest req = WebRequest.CreateHttp(_serverUrl + "channel.zip");
req.Method = "GET";
req.BeginGetResponse(new AsyncCallback(WebComplete), req);
}
catch (Exception ex)
{
throw ex;
}
}
void WebComplete(IAsyncResult a)
{
HttpWebRequest req = (HttpWebRequest)a.AsyncState;
HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a);
Stream stream = res.GetResponseStream();
byte[] content = readFully(stream);
unzip(content);
}
这里是否存在某种浏览器缓存问题?我希望我提出的每一个请求都能一直传到网络服务器。
是的,浏览器可能正在缓存请求。如果你想禁用它,你可以修改服务器以发送Cache-Control: no-cache
标头,或者你可以在URL上附加某种uniquifier,以阻止浏览器缓存请求:
void _timer_Tick(object sender, EventArgs e)
{
try
{
HttpWebRequest req = WebRequest.CreateHttp(_serverUrl + "channel.zip?_=" + Environment.TickCount);
req.Method = "GET";
req.BeginGetResponse(new AsyncCallback(WebComplete), req);
}
catch (Exception ex)
{
throw ex;
}
}
可能是您的计时器冻结,而不是web请求。在计时器事件中放入一个Debug.WriteLine
,确保它被调用多次。
在后台任务中使用计时器也是个坏主意。与其使用计时器,不如创建一个在请求之间休眠的后台任务。这样,即使太长的服务器请求也不会导致调用重叠。
试试以下几行:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork+=(s,a)=>{
try{
while (true)// or some meaningful cancellation condition is false
{
DownloadZipFile();
Sleep(FiveMinutes);
// don't update UI directly from this thread
}
} catch {
// show something to the user so they know automatic check died
}
};
worker.RunAsync();