我正在Azure平台上开发Web API RESTful服务.
我认为默认的客户端缓存行为是缓存GET请求(因为GET是幂等的全部).
令我惊讶的是,当我将服务部署到Azure时,所有响应都通过Cache-Control:私有标头或其他缓存禁用标头发送.
我尝试了建议in this question的解决方案,它在IIS本地工作,但是一旦我们部署到Azure就无法工作.我在文档中找不到任何关于此功能的内容,我认为这在RESTful服务中是非常基本的,我真的希望我遗漏了一些明显的东西,在MVC中它很容易.
TL;博士
我们需要在使用Azure和Web API时在客户端缓存GET请求.
解决方法:
我不相信Azure在这方面对你做了什么.这是您需要准确指定资源所需的缓存属性的问题.
使用WebAPI,您可以通过可通过myHttpResponseMessage.Headers.CacheControl属性访问的CacheControlHeaderValue
来控制响应所具有的缓存属性.
假设您有一个像这样的控制器动作:
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.像往常一样,有很多方法可以让猫皮肤变色,你必须确定哪种方法最适合你的特定问题领域.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。