2015-07-23 19 views
17

Tôi đang cố gắng đặt tiêu đề bộ nhớ cache trong ASP.NET MVC Web API, nhưng phản hồi từ IIS cho thấy bộ giá trị CacheControl đang bị bỏ qua.Đầu đề Cache-Control không được gửi phản hồi mặc dù được định cấu hình trên đối tượng phản hồi

Giả thiết ban đầu của tôi là tôi đã sử dụng EnableCorsAttribute trong System.Web.Http.Cors, đây là trường hợp cần thiết trong trường hợp sử dụng này. Tuy nhiên, ngay cả khi không có thuộc tính đó, tiêu đề Cache-Control phản hồi vẫn là 'riêng tư'.

Có điều gì tôi đang làm sai ở đây không?

// GET api/<version>/content 
    // [EnableCors(origins: "*", headers: "*", methods: "*")] 
    public HttpResponseMessage Get(HttpRequestMessage request) 
    { 
     int cacheMaxAgeSeconds; 

     string cacheMaxAgeString = request.GetQueryString("cache-max-age") ?? request.GetQueryString("cache-max-age-seconds"); 

     string rawUri = request.RequestUri.ToString(); 

     try 
     { 
      cacheMaxAgeSeconds = cacheMaxAgeString == null ? Config.ApiCacheControlMaxSeconds : int.Parse(cacheMaxAgeString); 
     } 
     catch (Exception ex) 
     { 
      cacheMaxAgeSeconds = Config.ApiCacheControlMaxSeconds; 

      //... 
     } 

     try 
     { 
      //... 

      var response = new HttpResponseMessage(HttpStatusCode.OK) 
      { 
       Content = new StringContent("...", Encoding.UTF8, "application/json") 
      }; 

      response.Headers.CacheControl = new CacheControlHeaderValue 
      { 
       Public = true, 
       MaxAge = TimeSpan.FromSeconds(cacheMaxAgeSeconds) 
      }; 

      return response; 
     } 
     catch (Exception apiEx) 
     { 
      //... 
     } 
    } 

đáp ứng

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: application/json; charset=utf-8 
Date: Thu, 23 Jul 2015 10:53:17 GMT 
Server: Microsoft-IIS/7.5 
Set-Cookie: ASP.NET_SessionId=knjh4pncbrhad30kjykvwxyz; path=/; HttpOnly 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Content-Length: 2367 
Connection: keep-alive 
+0

là có một lý do bạn đang cố gắng để cuộn của riêng bạn ở đây qua một cái gì đó giống như https://github.com/filipw/AspNetWebApi-OutputCache? – BMac

+0

Có, tôi thực sự muốn người gọi có thể chỉ định khoảng thời gian cache. Giá trị được đọc từ chuỗi truy vấn và nguồn cấp dữ liệu vào các giá trị tiêu đề kiểm soát bộ nhớ cache. – gb2d

+0

hmm, nếu có ai biết câu trả lời cho câu hỏi này thì https://twitter.com/filip_woj (tác giả của gói nuget ở trên) có thể xứng đáng với anh ta trên twitter. – BMac

Trả lời

4

Câu trả lời, sau khi nhặt này lên một vài tuần sau:

Cache-Control tiêu đề dường như được thiết lập để 'riêng tư' khi chạy debug xây dựng. Vấn đề sẽ biến mất khi tôi chạy với bản phát hành bản phát hành.

6

Mã dưới bộ "Cache-Control: public, max-age = 15" một cách chính xác trong ứng dụng WebAPI vani (System.Web.Http 4.0.0.0). Vì vậy ... có thể không phải chính bản thân WebApi gây ra vấn đề.

Bạn có thể có một số phép thuật trong dự án thay đổi cài đặt bộ nhớ cache (nghĩ về bộ lọc hành động toàn cầu hoặc tương tự). Hoặc có thể bạn đang đi qua proxy mà viết lại tiêu đề HTTP.

public HttpResponseMessage Get() 
    { 
     var content = new JavaScriptSerializer().Serialize(new { foo = "bar" }); 

     var response = new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new StringContent(content, Encoding.UTF8, "application/json") 
     }; 

     response.Headers.CacheControl = new CacheControlHeaderValue 
     { 
      Public = true, 
      MaxAge = TimeSpan.FromSeconds(15) 
     }; 

     return response; 
    } 

// returns in the response: "Cache-Control: public, max-age=15" 
1

Để thêm một thứ khác có thể gây ra điều này:

Bạn chạy qua đường ống Owin.

Trong trường hợp đó, bạn cần phải thiết lập các tiêu đề trong một middleware Owin định nghĩa như thế này:

class MiddleWare : OwinMiddleware 
{ 
    public MiddleWare(OwinMiddleware next) 
    : base(next) 
    { 
    } 
    public override async Task Invoke(IOwinContext context) 
    { 
     context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate"; 
     context.Response.Headers["Pragma"] = "no-cache"; 
     context.Response.Headers["Expires"] = "0"; 
     await Next.Invoke(context); 
    } 
} 
+0

Rắc rối vào một vấn đề với IE11 tích cực bộ nhớ đệm phản hồi ajax và middleware này đã làm các trick. Cảm ơn! – seangwright

Các vấn đề liên quan