4

我正在 Azure 平台上开发 Web API RESTful 服务。

我认为默认的客户端缓存行为是缓存 GET 请求(因为 GET 是幂等的)。

令我惊讶的是,当我将服务部署到 Azure 时,所有响应都带有Cache-Control: private标头或其他不允许缓存的标头发送。

我尝试了这个问题中建议的解决方案,它确实在 IIS 中本地工作,但一旦我们部署到 Azure 就无法工作。我在文档中找不到任何关于此功能的内容,我认为这在 RESTful 服务中非常基本,我真的希望我遗漏了一些明显的东西,在 MVC 中这很容易。

tl;博士

使用 Azure 和 Web API 时,我们需要GET在客户端缓存请求。

4

3 回答 3

5

我不相信 Azure 在这方面对您有任何影响。您需要准确指定资源所需的缓存属性。

使用 WebAPI,您可以控制响应具有哪些缓存属性,这些属性CacheControlHeaderValue可通过myHttpResponseMessage.Headers.CacheControl属性访问。

假设您有这样的控制器操作:

public Foo Get(int id)
{
    Foo myFoo = LoadSomeFooById(id);

    return myFoo;
}

你需要做这样的事情来明确控制缓存:

public HttpResponseMessage Get(int id)
{
    Foo myFoo = LoadSomeFooById(id);

    HttpResponseMessage myHttpResponseMessage = this.Request.CreateResponse(HttpStatusCode.OK, myFoo)

    CacheControlHeaderValue cacheControlHeaderValue = new CacheControlHeaderValue(); 
    cacheControlHeaderValue.Public = true;    
    cacheControlHeaderValue.MaxAge = TimeSpan.FromMinutes(30);

    myHttpResponseMessage.Headers.CacheControl = cacheControlHeaderValue;

    return myHttpResponseMessage;
}

您期望的与缓存相关的许多其他属性也可以在CacheControlHeaderValue该类中使用,这只是最基本的示例。

另外,请记住,我的示例非常暴力/简单,因为所有缓存行为/逻辑都在 action 方法中。一个更简洁的实现可能是拥有一个ActionFilterAttribute包含所有基于属性设置的缓存逻辑并将其应用于HttpResponseMessage. 然后您可以恢复到更以模型为中心的操作方法签名,因为在这种情况下,您将不再需要HttpResponseMessage在该级别访问。像往常一样,给猫剥皮的方法有很多,您必须确定哪种方法最适合您的特定问题域。

于 2013-02-14T23:05:44.380 回答
0

看看这个http://forums.asp.net/post/4939481.aspx它实现了缓存作为修改 HTTP 响应的属性。

免责声明:我没有尝试过。

于 2013-02-17T09:22:17.670 回答
0

I would recommend this https://github.com/filipw/AspNetWebApi-OutputCache

Simple, quick and has various options to cache.

Hope that helps

于 2015-03-12T16:22:36.823 回答