Silverlight只发出一个http请求

本文关键字:一个 http 请求 Silverlight | 更新日期: 2023-09-27 18:00:12

我正在开发一个Silverlight应用程序,该应用程序生成Http请求,并从web服务器上传zip文件。zip文件每n分钟从web服务器中提取一次,这种行为由计时器控制。

我尝试过使用WebClientHttpWebRequest类,但结果相同。请求仅在第一次到达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);
    }

这里是否存在某种浏览器缓存问题?我希望我提出的每一个请求都能一直传到网络服务器。

Silverlight只发出一个http请求

是的,浏览器可能正在缓存请求。如果你想禁用它,你可以修改服务器以发送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();