2017-08-10 100 views
0

我处于我的第一个Xamarin.Forms应用程序的测试阶段,该应用程序严重依赖于HttpClient从远程站点检索JSON数据。我发现一旦发出请求,响应似乎被缓存,并且更新的数据永远不会被检索。我正在初始化HttpClient,如下所示:Xamarin Forms应用程序,HttpClient似乎缓存响应FOREVER

new HttpClient() 
{ 
    Timeout = new TimeSpan(0, 0, 1, 0), 
    DefaultRequestHeaders = 
    { 
    CacheControl = CacheControlHeaderValue.Parse("no-cache, no-store, must-revalidate"), 
    Pragma = { NameValueHeaderValue.Parse("no-cache")} 
    } 
} 

这些请求标头似乎没有任何帮助。如果我将其中一个URL放入浏览器中,则会获得更新数据的JSON响应。服务器端也设置了no-cache头。

任何想法如何我可以每次都强制一个新的请求? TIA。这个测试是在Android模拟器中完成的,顺便说一句。我不知道iOS版本是否具有类似的行为。

+0

您使用的是AndroidHttpHandler吗? – Cheesebaron

回答

1

我建议你使用modernhttpclient nuget package,并实现你的Android的代码,如:

var httpClient = new HttpClient(new NativeMessageHandler()); 

此代码工作在两个Android,iOS和/或代码的PCL。基本上这个nuget软件包确保您使用最新的平台优化为HttpClient。对于Android,这是OkHttp -package,对于iOS,这是NSURLSession

这可以帮助您防止提供的HttpClient类的任何怪癖,并使用您运行的平台提供的优化。

像你所展示的问题不应该再发生。

+1

我不喜欢你推荐modernhttpclient。它不适用于HTTP/2或SPDY。它在与TLS 1.2站点交谈时也会呕吐。 – Cheesebaron

+0

我明白了。 Xamarin大学的教练称这是我培训期间的最佳做法之一,所以我只能假设他们是正确的。我对您所描述的内容没有经验,但是我们的生产中确实有一些相当复杂的Xamarin应用程序,它们具有相当复杂(但标准)的Azure Web App后端。没有任何问题。 –

+0

我有和@Cheesebaron一样的经历。这一切都运行良好,直到某些版本的Mono开始在Modern中引发问题。如果连接失败,应用程序将随机崩溃,然后在连接恢复后重试查询。 https://github.com/paulcbetts/ModernHttpClient/issues/229删除现代完全固定。目前为了解决“缓存”问题,我只是添加随机生成的guid的'?cachebuster = '。这对于查找日志文件中的特定请求非常适用:-) –