No cache with HttpClient in Windows Phone 8

后端 未结 5 379
夕颜
夕颜 2020-12-03 18:40

I\'ve read that in order to disable caching while using get and post methods in HttpClient, I need to use a WebRequestHandler as my HttpClien

相关标签:
5条回答
  • 2020-12-03 18:58

    I found 3 ways

    1. Add a random Query String to the end of your URI (think Guid.NewGuid()) this will avoid caching on the client as the Query String will be different each time

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

    1. Specify no cache in the OutgoingResponse header within your WCF service operation:
    var __request = (HttpWebRequest)WebRequest.Create(url.ToString());
    if (__request.Headers == null)
        __request.Headers = new WebHeaderCollection();
    __request.Headers.Add("Cache-Control", "no-cache");
    
    1. markup your service operation with the AspNetCacheProfile attribute:
    [AspNetCacheProfile("GetContent")]  
    public ResultABC GetContent(string abc)  
    {  
      __request = (HttpWebRequest)WebRequest.Create(abc);
      return __request;  
    }
    

    And update your 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>
    
    0 讨论(0)
  • 2020-12-03 19:08

    I wrote a HttpMessageHandler based on the solution above:

    public class BypassCacheHttpRequestHandler : HttpClientHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (request.Headers.IfModifiedSince == null)
                request.Headers.IfModifiedSince = new DateTimeOffset(DateTime.Now);
            return base.SendAsync(request, cancellationToken);
        }
    }
    

    Use new HttpClient(new BypassCacheHttpRequestHandler(), true); to initialize your HttpClient then you can always bypass cache.

    0 讨论(0)
  • 2020-12-03 19:19

    It's not possible to reference regular .NET assemblies in a Windows Phone 8 project. You can only use the .NET API for Windows Phone. This is a subset of regular .NET. See http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207211%28v=vs.105%29.aspx for more info.

    The default caching of HttpClient (and HttpWebRequest) can be worked around by appending a value to the query string. For example, a guid.

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

    A better solution, like pointed out in the comment above, is to set the "If-Modified-Since" header. HttpWebRequest has it built in:

    HttpWebRequest request = HttpWebRequest.CreateHttp(url);
    if (request.Headers == null)
        request.Headers = new WebHeaderCollection();
    // Make sure that you format time string according RFC.
    // Otherwise setting header value will give ArgumentException for culture like 'ti-ER'
    request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString("r"); 
    

    But you could add the header manually using an HttpClient I guess.

    0 讨论(0)
  • 2020-12-03 19:19

    If using Windows.Web.Http.HttpClient, the clean way to fix this issue from the client side is:

    var httpFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
    httpFilter.CacheControl.ReadBehavior = 
        Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent;
    var httpClient = new Windows.Web.Http.HttpClient(httpFilter);
    

    This way, you avoid filling the app's cache with temp files when using random query strings. Each response is stored in the cache.

    Of course, it is always recommended to fix the issue from the server side. Add the following header, and you won't need to worry about cache on each client:

    Cache-Control: no-cache
    

    Full response:

    HTTP/1.1 200 OK
    Content-Length: 31
    Content-Type: text/plain; charset=UTF-8
    Cache-Control: no-cache
    
    ...
    
    0 讨论(0)
  • 2020-12-03 19:19

    This for windows phone to get fresh data instead of catching data

    Using(HttpClient httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
        //your code goes here`enter code here`
    }
    

    another alternative is set

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    

    in server page Page_Load if u get data from aspx page

    0 讨论(0)
提交回复
热议问题