2015-07-23 14 views
17

पर कॉन्फ़िगर किए जाने के बावजूद कैश-कंट्रोल हेडर प्रतिक्रिया में नहीं भेजे गए हैं, मैं एएसपी.नेट एमवीसी वेब एपीआई में कैश हेडर सेट करने की कोशिश कर रहा हूं, लेकिन आईआईएस की प्रतिक्रिया से पता चलता है कि कैशकंट्रोल मान सेट को अनदेखा किया जा रहा है।प्रतिक्रिया ऑब्जेक्ट

मेरी मूल धारणा यह थी कि मैं System.Web.Http.Cors में EnableCorsAttribute का उपयोग कर रहा था, जो इस उपयोग मामले में आवश्यक है। हालांकि, यहां तक ​​कि उस विशेषता के बिना, प्रतिक्रिया कैश-कंट्रोल हेडर अभी भी 'निजी' है।

क्या मैं यहां कुछ गलत कर रहा हूं?

// 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) 
     { 
      //... 
     } 
    } 

रिस्पांस सेट नीचे

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

एक कारण तुम यहाँ https://github.com की तरह कुछ पर अपने स्वयं के रोल करने की कोशिश कर रहे है/filipw/AspNetWebApi-OutputCache? – BMac

+0

हां, मैं वास्तव में कॉलर को कैश अवधि निर्दिष्ट करने में सक्षम होना चाहता हूं। मान क्वेरी स्ट्रिंग और फीड से कैश कंट्रोल हेडर मानों में पढ़ा जाता है। – gb2d

+0

हम्म, अगर किसी को इसका जवाब पता चलेगा तो यह https://twitter.com/filip_woj (उपरोक्त नुजेट पैकेज का निर्माता) ट्विटर पर उनके पास पहुंचने योग्य होगा। – BMac

उत्तर

4

जवाब है, यह कुछ हफ्ते बाद उठाया था:

कैश नियंत्रण हेडर 'निजी' के लिए स्थापित किया जाना जब डिबग बनाता चल रहा प्रतीत होता है। जब मैं रिलीज बिल्ड के साथ दौड़ता हूं तो समस्या दूर हो जाती है। एक Owin पाइप लाइन के माध्यम

आप चलाएँ:

6

कोड "कैश नियंत्रण: सार्वजनिक, अधिकतम उम्र = 15" सही ढंग से वेनिला WebAPI आवेदन में (System.Web.Http 4.0.0.0)। तो ... शायद यह वेबएपी नहीं है जो इस मुद्दे का कारण बनता है।

आपके पास अपने प्रोजेक्ट में कुछ जादू हो सकती है जो कैश सेटिंग्स बदलती है (वैश्विक क्रिया फ़िल्टर या कुछ इसी तरह के बारे में सोचें)। या हो सकता है कि आप प्रॉक्सी से गुज़र रहे हों जो 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

एक और बात यह है कि इस का कारण बन सकती को जोड़ने के लिए।

उस मामले में, आप एक Owin मिडलवेयर इस रूप में परिभाषित में हेडर निर्धारित करने की आवश्यकता:

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

आईई 11 आक्रामक रूप से अजाक्स प्रतिक्रियाओं को कैश करने के साथ एक मुद्दे में भाग गया और इस मिडलवेयर ने चाल की। धन्यवाद! – seangwright

संबंधित मुद्दे