C# Windows Phone 8中的HttpClient没有缓存
我已经了解到,为了在C# Windows Phone 8中的HttpClient没有缓存,c#,.net,windows-phone-8,C#,.net,Windows Phone 8,我已经了解到,为了在HttpClient中使用get和post方法时禁用缓存,我需要使用WebRequestHandler作为我的HttpClientHandler,并更改其缓存策略。但是,WebRequestHandler不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,因此我尝试将.dll添加到项目中作为参考。我收到一条错误消息: Microsoft Visual Studio 无法删除对更高版本或不兼容程序集的引用 添加到项
HttpClient
中使用get和post方法时禁用缓存,我需要使用WebRequestHandler
作为我的HttpClientHandler
,并更改其缓存策略。但是,WebRequestHandler
不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,因此我尝试将.dll添加到项目中作为参考。我收到一条错误消息:
Microsoft Visual Studio
无法删除对更高版本或不兼容程序集的引用
添加到项目中
再次,经过一点搜索,我得出结论说.dll文件被阻止了,因为它是从另一个源下载的。为了解除封锁,我继续尝试解决方案。但是,它也不起作用,当我尝试添加.dll文件作为引用时,仍然会遇到相同的错误
我想做的就是使用我的HttpClient禁用缓存,我在这里做错了什么吗?我愿意接受任何类型的建议或帮助
我的系统是Windows 8.1,我使用的是Visual Studio 2013。我正在做的项目是一个WindowsPhone8应用程序。我试图引用的.dll目录是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.NET.Http.WebRequest.dll”。提前感谢。无法在Windows Phone 8项目中引用常规.NET程序集。您只能使用适用于Windows Phone的.NET API。这是常规.NET的子集。有关更多信息,请参阅 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手动添加头。我基于上述解决方案编写了一个
HttpMessageHandler
:
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);
}
}
公共类绕过CacheHttpRequestHandler:HttpClientHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
if(request.Headers.IfModifiedSince==null)
request.Headers.IfModifiedSince=新的DateTimeOffset(DateTime.Now);
返回base.sendaync(请求、取消令牌);
}
}
使用新的HttpClient(新的BypassCacheHttpRequestHandler(),true)初始化您的HttpClient
,然后您可以随时绕过缓存。我找到了3种方法
...
如果使用
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
...
这使windows phone能够获取新数据,而不是捕获数据
Using(HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
//your code goes here`enter code here`
}
另一种选择是设置
Response.Cache.SetCacheability(HttpCacheability.NoCache);
在服务器页面中,如果您从aspx页面获取数据,请加载。在请求标头中将ifModifiedSince标头设置为当前时间如何。.谢谢,添加ifModifiedSince标头似乎暂时有效。请注意,您应该使用
DateTime.UtcNow.ToString(“r”)代码>这样时间戳就可以按照RFC正确格式化了。你们救了我的命,我已经很久没把头撞到墙上了!最糟糕的是,这种自动缓存只在WP应用程序上处理,而不是在通用应用程序上处理,wtf?!此解决方案可能是针对Windows Phone的黑客攻击。我尝试在Xamarin应用程序(也适用于Windows Phone)中使用此选项,它导致服务器始终返回304 Not Modified响应,这是有意义的,因为如果服务器上存在任何类型的缓存,“立即”很少为真。最终对我起作用的是client.DefaultRequestHeaders.CacheControl=new CacheControlHeaderValue(){NoCache=true};选项2是避免从客户端缓存检索结果的正确方法。或者您可以只设置HttpClient.DefaultRequestHeader。另外,执行httpClient.DefaultRequestHeader.CacheControl=new CacheControlHeaderValue(){NoCache=true}更为正确;
HTTP/1.1 200 OK
Content-Length: 31
Content-Type: text/plain; charset=UTF-8
Cache-Control: no-cache
...
Using(HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
//your code goes here`enter code here`
}
Response.Cache.SetCacheability(HttpCacheability.NoCache);