2010-12-16 65 views
18

看來HttpWebRequest在WP7緩存是默認啓用的,我該如何關閉它? 添加一個隨機 參數url +「?param =」+ RND.Next(10000)的作品,但它是相當棘手,我不知道它是否會與所有服務器 工作。WP7 HttpWebRequest沒有緩存

+0

發現使用HttpWebRequest對象這個問題一個問題嗎?目前提供的答案都是服務器端解決方案。 (除了時間戳,我不喜歡) – invalidusername 2012-01-09 02:07:09

+0

順便說一句,一個很好的參數是DateTime.Now.Ticks。它會一直改變,它的大小是可以接受的(至少在頭幾十年:-)) – invalidusername 2012-01-09 02:41:46

回答

6

你怎麼知道這是手機,而不是服務器(或代理之間的某個地方)哪個緩存?
你是否檢查過與Fiddler2(或同等學歷)?

您是否嘗試過設置標頭來禁用緩存?
喜歡的東西:

myRequest = (HttpWebRequest)WebRequest.Create(myUri); 

myRequest.Headers["Cache-Control"] = "no-cache"; 
myRequest.Headers["Pragma"] = "no-cache"; 
+2

這不是服務器,因爲相同的URL更新corectly在BlackBerry,iPhone和Android – Janci 2010-12-16 14:36:57

+3

更改標頭不起作用,不幸的是。 – dethSwatch 2010-12-28 21:23:53

+2

我遇到了這個問題,我正在爲WP7應用開發ReSTful端點。更改服務器以確保它返回「Cache-Control」頭設置爲「no-cache」的響應,從而解決了此問題。 – dwynne 2011-04-06 13:27:30

0

添加隨機數不壞,它會工作。我使用了時間(在Ajax調用中)。被放置在像一個文件夾的網址。

+0

是的,它現在工作,但我不滿意這一點,我正在尋找更好的解決方案 – Janci 2010-12-16 14:53:35

+0

與隨機數,你可以得到相同的數字,但隨着時間(像從午夜的毫秒 - 1至86 400 000)它幾乎不可能。你甚至可以把這兩個結合起來。你用POST試過了嗎? – 2010-12-16 15:41:29

-2

有可能... :)我花了實驗的一個星期,答案非常簡單:

 HttpWebRequest _webRequest = WebRequest.CreateHttp(_currentUrl); 

    _webRequest.AllowReadStreamBuffering = false 
_webRequest.BeginGetResponse(_onDownload, 
userState); 
+0

它不能解決緩存問題。 – 2011-05-28 18:07:09

+0

不解決問題+拋出內部異常「不支持」。 – 2012-03-04 16:50:43

19

以供將來參考,這個工作對我來說(我不能因使用額外的查詢參數項目要求):

 HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
     if (request.Headers == null) 
     { 
      request.Headers = new WebHeaderCollection(); 
     } 
     request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString(); 
+1

作品。不知道爲什麼。 – 2012-03-04 16:55:16

+0

@Agent_L WP7 HTTP客戶端的請求看起來不同 – SandRock 2012-03-30 09:12:51

1

我們已經看到了與Chrome託管的Silverlight相同的行爲。

如果我們想要防止緩存,我們會在我們的請求URL中添加一個"?nocache=" + DateTime.Now.Ticks.ToString()

11

HttpClient(便攜式Windows Phone)「Cache-Control」:服務器端的「no-cache」有時僅適用。而且我也無法將查詢字符串隨機值添加到RESTful API調用中。從@frno做工不錯,看起來像的HttpClient

解決方案:

client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow; 

謝謝。

+1

這是唯一對我有用的方法。其他緩存標頭似乎沒有效果。 – 2013-08-31 14:40:17

+0

非常好的解決方案,也適用於Windows 8.1 Store Universal應用程序。 – NBoymanns 2014-07-07 11:09:32

+0

這是爲我們工作,現在它不時拋出304s。 – 2014-08-07 18:22:12

1

我發現3種方式

  1. 添加一個隨機的查詢字符串的URI的末尾(想想Guid.NewGuid()),這將避免在客戶端上的緩存作爲查詢字符串每次都會有所不同

string uri =「http://host.com/path?cache=」+ Guid.NewGuid()。的ToString();

  • 指定WCF服務操作中在OutgoingResponse頭沒有高速緩存:
  • var __request = (HttpWebRequest)WebRequest.Create(url.ToString()); 
    if (__request.Headers == null) 
        __request.Headers = new WebHeaderCollection(); 
    __request.Headers.Add("Cache-Control", "no-cache"); 
    
  • 使用AspNetCacheProfile屬性標記您的服務操作:
  • [AspNetCacheProfile("GetContent")] 
    public ResultABC GetContent(string abc) 
    { 
        __request = (HttpWebRequest)WebRequest.Create(abc); 
        return __request; 
    } 
    

    和更新您的web.config

    <system.web> 
    <caching> 
        <outputCache enableOutputCache="true" /> 
        <outputCacheSettings> 
         <outputCacheProfiles > 
          <add name="GetContent" duration="0" noStore="true" location="Client" varyByParam="" enabled="true"/> 
         </outputCacheProfiles> 
        </outputCacheSettings> 
    </caching> 
    ... 
    </system.web>