使用Azure上的Web API缓存GET请求

Ben*_*aum 4 c# azure asp.net-web-api

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

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

令我惊讶的是,当我将服务部署到Azure时,所有响应都通过Cache-Control: private标头或其他缓存禁用标头发送.

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

TL;博士

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

Dre*_*rsh 5

我不相信Azure在这方面对你做了什么.这是您需要准确指定资源所需的缓存属性的问题.

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

假设您有一个像这样的控制器动作:

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

    return myFoo;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

许多与您期望的缓存相关的其他属性也可以在CacheControlHeaderValue课堂上使用,这只是最基本的例子.

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

  • 如果您以前没有显式返回HttpResponseMessage(例如,您正在返回强类型域对象并让WebAPI为您包装),那么您现在需要.一旦你想控制这样的HTTP特性,你需要开始在那个级别工作.我将使用更明确的示例更新示例代码. (2认同)