在Windows Phone 8中没有使用HttpClient缓存
我已经读过为了在HttpClient
使用get和post方法时禁用缓存,我需要使用WebRequestHandler
作为我的HttpClient
的HttpClientHandler
,并更改其缓存策略。 但是, 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 ...
我找到了三种方法
- 在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
...
我根据上面的解决方案编写了一个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页面获取数据