地理位置/过滤和HTTP缓存

时间:2013-06-04 10:52:45

标签: asp.net-web-api

我正在尝试为ASP.NET Web Api解决方案添加缓存支持(HTTP和服务器)。

该解决方案位于地理位置,这意味着我可以根据呼叫者IP地址获得不同的结果。

使用类似于 VaryByCustom like this one)的方法,可以轻松解决服务器端缓存的问题。但是,这并没有解决客户端HTTP缓存的问题。以下是替代方案

我正在考虑以下选项:

  1. 在缓存中执行必须重新验证

    保持验证服务器端使用与VaryByCustom相同的算法,但在服务器端包含额外的缓存重新验证调用ETAGS或任何跟踪原始缓存值的原始国家/地区的机制。

  2. 创建特定国家/地区的路线HTTP 302

    在此方案中,应用程序调用

    http://site/UK/content
    

    如果缓存过期时来自美国IP地址,则重定向到美国版本

    http://site/US/content
    

    它可能会显示与原始IP本地IP不匹配的过期内容。如果缓存过期是一个很小的值(<1小时),那不是一个严重的问题,因为国家变化相当罕见。

  3. 推荐的解决方案是什么?

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解这个问题。

对于客户端缓存,如果启用私有缓存,则英国用户将缓存英国版http://site/content,美国用户将缓存美国版http://site/content

我能看到的唯一问题是用户是否从美国旅行到英国并访问内容。或者,如果您允许公共缓存,并且美国和英国用户共享某些中间人。

答案 1 :(得分:0)

在详细评估之后,选择了第一种方法。实际实施是:

  1. 创建一个取决于原始国家/地区IP地址的缓存密钥
  2. 为该缓存密钥创建ETag并将其存储在服务器缓存
  3. 包含ETag If-None-Match标头的其他请求在服务器中评估缓存新鲜度:
    • 如果原籍国相同,则缓存键将相同且ETag有效,返回未修改的HTTP 304
    • 如果原产国不同,缓存密钥会有所不同,且ETag无效,返回HTTP 200并返回新的ETag。
  4. 同意Poul-Henning Kamp地理位置应该是一个传输级别的东西,但遗憾的是不是,所以这是我们能够确定特定国家/地区的缓存新鲜度的唯一方法。

    缺点是不能有任何基础设施缓存,例如,所有请求都需要检查服务器的缓存新鲜度。