WCF REST JSON服务缓存

4
我有一个返回JSON的WCF Web服务。
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
Stream GetStuff(int arg);

我正在使用这种方法将一个对象图转换为JSON:

private static Stream ToJson(object obj)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string json = serializer.Serialize(obj);

    if (WebOperationContext.Current != null)
    {
        OutgoingWebResponseContext outgoingResponse = WebOperationContext.Current.OutgoingResponse;

        outgoingResponse.ContentType = "application/json; charset=utf-8";
        outgoingResponse.Headers.Add(HttpResponseHeader.CacheControl, "max-age=604800"); // one week
        outgoingResponse.LastModified = DateTime.Now;
    }

    return new MemoryStream(Encoding.UTF8.GetBytes(json));
}

我希望浏览器能够缓存响应,但是浏览器仍在向服务器生成"If-Modified-Since"调用,并使用"304 Not Modified"进行重播。我希望浏览器能够缓存并使用响应,而不是每次都向服务器发出"If-Modified-Since"调用。
我注意到,即使我在代码中指定了"Cache-Control "max-age=604800"",WCF发送的响应头也是"Cache-Control no-cache,max-age=604800"。为什么WCF添加了"no-cache"部分,如何阻止它添加?
1个回答

2
尝试将Cache-Control设置为“public,max-age = ...”。这可能会防止WCF应用默认的缓存策略头。
此外,有所谓的“远期过期标头”。对于重度长期缓存,我使用Expires标头代替Cache-Control:“max-age = ...”,并仅使Cache-Control保持“public”。

谢谢,这解决了我的问题:HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(14)); HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);我不确定HttpContext.Current在WCF Web服务中是否可用。 - Catalin DICU
3
只有在运行aspNet兼容模式下才可用。 - Benjamin Baumann

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