UWP 应用中的 HttpClient 缓存

Posted

技术标签:

【中文标题】UWP 应用中的 HttpClient 缓存【英文标题】:HttpClient caching in UWP apps 【发布时间】:2017-08-14 10:43:57 【问题描述】:

我同时拥有 WebApi 服务器(asp.net 核心应用)和客户端(UWP 应用)。

我使用 UWP 应用中的 HttpClient 调用 WebApi 服务。

有些资源是只读的,因此可以缓存:

[ResponseCache(Duration = 60*60*12, VaryByQueryKeys = new[]  "id" , Location = ResponseCacheLocation.Client)]`
[HttpGet("id")]
public IActionResult Get(string id)  ... 

是否可以在 UWP 应用的 HttpClient 中启用缓存,还是我必须自己做?

【问题讨论】:

您希望使用哪种缓存?如果您不想使用简单的内置功能,可以使用外部库添加一种在客户端上缓存的简单方法。示例:CacheCow 和 Cashew 【参考方案1】:

HttpClient 已经(很好)缓存了自己。如果默认的缓存行为不够用,还可以通过HttpCacheControl类对缓存进行进一步的控制,该类将读写行为分开。

更重要的是知道如何使用您的 HttpClient。即使它实现了 IDisposable,您也不应该释放它,而是在整个应用程序中保持一个单个 HttpClient 对象处于活动状态,它是 designed for re-use。

HttpClient 没有做的,是在断开连接时返回缓存的结果。因此还有其他库,如 Akavache,它创建了一个离线键值存储。

【讨论】:

我不处理 HttpClient,我使用单例,但它仍然向 Web 服务器发出相同的请求(观察到 Fiddler)。为什么? 顺便说一句:您可以在 HttpClient 的 HttpBaseProtocolFilter 上设置缓存标志以仅从缓存中获取数据。它专为处理“无网络”情况而设计。 (但请始终记住,http 缓存不是数据库!系统很可能会决定从缓存中删除内容或从不将其添加到缓存中。你知道,原因)。

以上是关于UWP 应用中的 HttpClient 缓存的主要内容,如果未能解决你的问题,请参考以下文章

详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

带有json字符串的后台任务中的UWP Httpclient postasync

UWP HttpClient 存储 cookie 直到应用被卸载

HttpClient 在上传之前读取整个文件。 UWP

uwp 解析或反序列化 httpclient 响应

HttpClient.SendAsync 在 Xamarin.Forms Android 上引发 ObjectDisposedException,但在 UWP 上却没有