在Windows Phone 8中没有使用HttpClient缓存

我已经读过为了在HttpClient使用get和post方法时禁用缓存,我需要使用WebRequestHandler作为我的HttpClientHttpClientHandler ,并更改其缓存策略。 但是, WebRequestHandler不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,因此我尝试将.dll添加到项目中作为参考。 我收到一条错误消息:

Microsoft Visual Studio

无法将对更高版本或不兼容程序集的引用添加到项目中。

再次,经过一点点搜索,我得出结论,.dll文件被阻止,因为它是从另一个源下载的。 为了解锁它,我继续在这里尝试解决方案。 但是,它也没有工作,当我尝试添加.dll文件作为参考时,我仍然得到相同的错误。

我想要做的就是使用我的HttpClient禁用缓存,我在这里做错了吗? 我愿意接受任何建议或帮助。

我的系统是Windows 8.1,我正在使用Visual Studio 2013.我正在开发的项目是Windows Phone 8应用程序。 我试图引用的.dll目录是“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ System.Net.Http.WebRequest.dll”。 先感谢您。

在Windows Phone 8项目中引用常规.NET程序集是不可能的。 您只能使用.NET API for Windows Phone。 这是常规.NET的一个子集。 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207211%28v=vs.105%29.aspx 。

可以通过向查询字符串附加值来解决HttpClient(和HttpWebRequest)的默认缓存。 例如,一个guid。

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

如上面的注释中指出的更好的解决方案是设置“If-Modified-Since”标头。 HttpWebRequest内置它:

 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"); 

但是你可以使用HttpClient手动添加标题。

如果使用Windows.Web.Http.HttpClient ,从客户端修复此问题的简洁方法是:

 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); 

这样,在使用随机查询字符串时,您可以避免使用临时文件填充应用程序的缓存。 每个响应都存储在缓存中。

当然,始终建议从服务器端解决问题。 添加以下标头,您不必担心每个客户端上的缓存:

 Cache-Control: no-cache 

完整回复:

 HTTP/1.1 200 OK Content-Length: 31 Content-Type: text/plain; charset=UTF-8 Cache-Control: no-cache ... 

我找到了三种方法

  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

          ...  

我根据上面的解决方案编写了一个HttpMessageHandler

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

使用new HttpClient(new BypassCacheHttpRequestHandler(), true); 要初始化您的HttpClient您可以随时绕过缓存。

这为Windows手机获取新数据而不是捕获数据

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

设置了另一种选择

 Response.Cache.SetCacheability(HttpCacheability.NoCache); 

在服务器页面Page_Load中,如果你从aspx页面获取数据