【问题标题】:WP7 HttpWebRequest without cachingWP7 HttpWebRequest 没有缓存
【发布时间】:2011-05-26 14:03:39
【问题描述】:

WP7中的HttpWebRequest缓存好像是默认开启的,如何关闭呢? 添加随机 param url + "?param=" + RND.Next(10000) 有效,但这很棘手,我不确定它是否有效 与所有服务器。

【问题讨论】:

  • 使用 HttpWebRequest 对象发现了这个问题的问题?当前提供的答案都是服务器端解决方案。 (除了时间戳,我不喜欢)
  • 顺便说一句,一个好的参数是 DateTime.Now.Ticks。它总是会改变,它的大小是可以接受的(至少在最初的几十年里:-))

标签: caching windows-phone-7 httpwebrequest


【解决方案1】:

为了将来参考,这对我有用(由于项目要求,我无法使用额外的查询参数):

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

【讨论】:

  • @Agent_L WP7 HTTP 客户端的请求看起来不同
【解决方案2】:

如果是 HttpClient(Windows Phone 便携式)“Cache-Control”:服务器端的“no-cache”仅在某些情况下有效。而且我也无法将查询字符串随机值添加到 RESTful api 调用中。

@frno 的解决方案效果很好,看起来像 HttpClient:

client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow;

谢谢。

【讨论】:

  • 这也是唯一适合我的方法。其他缓存头似乎没有效果。
  • 非常好的解决方案,也适用于 Windows 8.1 Store Universal 应用程序。
  • 这对我们有用,现在它不时抛出 304。
【解决方案3】:

您怎么知道缓存的是手机,而不是服务器(或介于两者之间的代理)?
您是否使用 Fiddler2(或同等产品)检查过这个?

您是否尝试过设置标头以禁用缓存?
比如:

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

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

【讨论】:

  • 这不是服务器,因为相同的 url 在 BlackBerry、iPhone 和 Android 上会正确更新
  • 我在为 WP7 应用程序开发的 ReSTful 端点上遇到了这个问题。更改服务器以确保它返回一个将“Cache-Control”标头设置为“no-cache”的响应解决了这个问题。
  • 我刚遇到这个问题,对我来说,添加标题(Cache-Control=no-cache 和 Pragma=no-cache)解决了这个问题。我确实意识到这是缓存响应的客户端(WebRequest)(关闭Web服务器并获取请求仍会返回缓存的结果)。
【解决方案4】:

我们已经看到在 Chrome 中托管的 Silverlight 出现了相同的行为。

如果我们想阻止缓存,我们会在请求 URL 中添加 "?nocache=" + DateTime.Now.Ticks.ToString()

【讨论】:

    【解决方案5】:

    我找到了 3 种方法

    1. 在 URI 的末尾添加一个随机查询字符串(想想 Guid.NewGuid())这将避免在客户端缓存,因为查询字符串每次都会不同

    string uri = "http://host.com/path?cache="+Guid.NewGuid().ToString();

    1. 在 WCF 服务操作的 OutgoingResponse 标头中指定不缓存:
    var __request = (HttpWebRequest)WebRequest.Create(url.ToString());
    if (__request.Headers == null)
        __request.Headers = new WebHeaderCollection();
    __request.Headers.Add("Cache-Control", "no-cache");
    
    1. 使用 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>
    

    【讨论】:

      【解决方案6】:

      添加随机数还不错,它会起作用。我用过时间(在ajax调用中)。像文件夹一样放在url中。

      【讨论】:

      • 是的,它现在有效,但我对此并不满意,我正在寻找更好的解决方案
      • 使用随机数可以获得相同的数字,但随着时间的推移(例如从午夜开始的毫秒 - 1 到 86 400 000),这几乎是不可能的。你甚至可以将这两者结合起来。你试过 POST 吗?
      【解决方案7】:

      是的,有可能... :) 我花了一周的时间进行实验,答案很简单:

            HttpWebRequest _webRequest = WebRequest.CreateHttp(_currentUrl);
      
           _webRequest.AllowReadStreamBuffering = false
       _webRequest.BeginGetResponse(_onDownload,
       userState);
      

      【讨论】:

      • 不解决问题+抛出内部异常“不支持”。
      猜你喜欢
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多