为Web服务创建光盘缓存的最佳方法

时间:2012-10-16 06:13:29

标签: c# wcf web-services caching

我创建了一个提供图像的网络服务。它永远是单向沟通。在从服务中获取图像的一面,图像永远不会被更改。

它有多个来源,有些可能很远,连接不良。 我已经为它创建了一个内存缓存,但是我还希望有一个光盘缓存来存储更长时间的图像。 我对这方面的最佳方法有点不确定。

首先,我的所有来源都是网络服务器,所以我真的不知道如何检查我想要使用的图像的最后修改日期(作为示例),以查看该文件是否具有改变。

其次,如何最好地存储我的本地缓存?只需将文件放入文件夹并将日期与原始来源进行比较即可? 或者,可能将所有时间戳存储在包含所有图像的txt文件中,以避免检查文件。 或者,可能将它们存储在本地SQL Express DB中?

一般来说,图像不是很大。大多数都在200kb左右。然而,时不时会有7+ mb。 最大的问题是,托管服务的某些位置是非常糟糕的连接,他们需要多次使用相同的图像。 没有真正的性能要求,我只想让它对我们的中央服务器的连接位置尽可能响应。

我无法安装任何“真正的”缓存系统。它必须是我能在代码中处理的东西。

1 个答案:

答案 0 :(得分:2)

为什么不在服务器上安装代理服务器,并通过它访问所有远程Web服务器?代理服务器将为您处理缓存。

编辑:由于你无法安装任何东西并且没有可用的数据库,我担心你自己会坚持实现磁盘缓存。

好消息是 - 它相对容易。您需要选择一个文件夹并将图像文件放在那里。您需要在图像标识和文件名之间进行唯一映射。如果您的图像ID是数字,则映射非常简单......

当您收到图像请求时,首先在磁盘上检查它。如果它在那里,你已经拥有它。如果没有,请从远程服务器下载并将其存储在那里,然后从那里提供服务。

您需要考虑并发请求。确保将文件写入磁盘是一个相对简短的过程(您可以在下载完成后编写它们)。将文件写入磁盘时,请确保没有人可以打开它进行读取,这样就可以避免发送不完整的文件。

现在您只需处理文件不在缓存中的情况,并立即收到两个请求。如果性能不是真正的问题,只需下载两次。