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
I found 3 ways
string uri = "http://host.com/path?cache=" + Guid.NewGuid().ToString();
var __request = (HttpWebRequest)WebRequest.Create(url.ToString()); if (__request.Headers == null) __request.Headers = new WebHeaderCollection(); __request.Headers.Add("Cache-Control", "no-cache");
[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>
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.
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.
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
...
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