在Web API格式化程序中设置Expires/Caching头信息

4

在Web API中,是否可以在MediaTypeFormatter内设置过期/缓存头?我尝试重写SetDefaultContentHeaders并设置过期标头,如下所示:

public override void SetDefaultContentHeaders(Type type, System.Net.Http.Headers.HttpContentHeaders headers, System.Net.Http.Headers.MediaTypeHeaderValue mediaType)
    {            
       headers.Expires = DateTime.Now.AddHours(24);            
    }

但是当在像Chrome工具这样的Web调试器中查看时,expires标头始终返回-1。同时,似乎在此处设置CacheControl标头不可能,因为它是一个响应标头而不是内容标头(无论这意味着什么)。


这里有同样的问题,并提供了一种解决方法,但仍然没有答案... http://stackoverflow.com/questions/14361219/setting-http-expires-header-in-mediatypeformatter-setdefaultcontentheaders-has-n - Display Name is missing
2个回答

9

看起来,任何设置HttpResponseMessage.Headers.CacheControl都会导致Expires头被设置并发出,但若不设置它,则Expires将被设置为-1的值。尝试设置response.Headers.CacheControl = new CacheControlHeaderValue()但是 不要设置 max-age 。您应该能够在任何公开HttpResponseMessage的地方这样做;例如在ApiControllerDelegatingHandler中。

根据RFC2616,如果CacheControl的max-age存在,则覆盖Expires,但如果只是像上面那样设置,它应该可以工作。

无论是否这样做是个好主意,都是有争议的,因为Expires是HTTP 1.0,而CacheControl是HTTP 1.1。


1
归咎于托管层。如果您使用自托管或Owin托管,您将永远不会看到那些非HTTP兼容的Expires: -1 - Darrel Miller

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接