微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 在Azure上使用Web API缓存GET请求

我正在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] 举报,一经查实,本站将立刻删除。

相关推荐