繁体   English   中英

Windows Phone 8中没有HttpClient缓存

[英]No cache with HttpClient in Windows Phone 8

我已经读过,为了在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

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

我根据上面的解决方案编写了一个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);
    }
}

使用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页面获取数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM