【问题标题】:WCF REST JSON service cachingWCF REST JSON 服务缓存
【发布时间】:2011-06-08 12:00:59
【问题描述】:

我有一个返回 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”部分,如何阻止它添加?

【问题讨论】:

    标签: c# .net wcf json http


    【解决方案1】:

    尝试将 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 服务中是否可用
    • 只有在aspNet兼容模式下运行才可用。
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多