2013-02-12 9 views
5

में "एक्सपीयर" http हेडर प्रोग्रामेटिक रूप से एएसपी.NET साइट में, "मैं समय सीमा" हेडर जोड़ना चाहता हूं, इसलिए मैं कुछ स्थिर फाइलों में "एक्सपियर" हेडर जोड़ना चाहता हूं, इसलिए मैंने इस तरह के फ़ोल्डर के लिए clientCache कॉन्फ़िगरेशन जोड़ा इन फ़ाइल हैं:एएसपीनेट

<system.webServer> 
    <staticContent> 
    <clientCache cacheControlMode="UseExpires" httpExpires="Wed, 13 Feb 2013 08:00:00 GMT" /> 
    </staticContent> 

संभव हो तो, मैं समय फ़ाइल पिछले + 24 घंटे में अपडेट था, उदाहरण के लिए यह निर्धारित करने के लिए, प्रोग्राम के रूप में httpExpires के मूल्य की गणना करना चाहते हैं।

क्या कोई तरीका कॉल करके httpExpires का मान प्राप्त करने के लिए कैश नियंत्रण को कॉन्फ़िगर करने का कोई तरीका है?

यदि नहीं, तो विकल्प क्या हैं? मैंने एक कस्टम http हैंडलर लिखने के बारे में सोचा था, लेकिन शायद एक आसान समाधान है ...

EDIT: कृपया ध्यान दें कि ये स्थैतिक फ़ाइलें हैं, इसलिए उन्हें नियमित एएसपीनेट पेज हैंडलर द्वारा सेवा नहीं दी जाती है।

उत्तर

7

आप Response.Cache का उपयोग प्रोग्रामिंग रूप से कैशिंग सेट करने के लिए कर सकते हैं।

Here's एक अच्छी तरह से दिखने वाला ट्यूटोरियल।

असल में आप कैशिंग नीति को Public (क्लाइंटसाइड + प्रॉक्सी) पर सेट करना चाहते हैं और समाप्ति शीर्षलेख सेट करना चाहते हैं। कुछ विधियों को अजीब तरह से नामित किया गया है, लेकिन यह एक आसान है।

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public); 
HttpContext.Current.Response.Cache.SetExpires(yourCalculatedDateTime); 

(ASP.NET डिजाइनरों Demeter के कानून ज्यादा पसंद नहीं आया, वे किया था?)

वैकल्पिक रूप से आप Response.Headers संग्रह, जहाँ आप उन्हें स्पष्ट रूप से बदल सकते हैं के माध्यम से heareds पहुँच सकते हैं।

इन दोनों तरीकों से सभी एएसपी.NET हैंडलर (एएसपीएक्स, एएसएमएक्स) में पहुंच योग्य है और संभवतः हर जगह बदला जा सकता है जहां आप वर्तमान एचटीपी कॉन्टेक्स्ट तक पहुंच सकते हैं।

+0

धन्यवाद, लेकिन इन स्थिर फ़ाइलें हैं, कहते हैं कि वे एक 'xyz' एक्सटेंशन है, इसलिए वे नहीं कर रहे हैं सामान्य एएसपीनेट हैंडलर द्वारा परोसा जाता है। क्या मुझे अपना खुद लिखना होगा? –

+1

ओह, क्षमा करें, आपके प्रश्न में याद किया। उस स्थिति में एक ** [HTTP मॉड्यूल] (http://support.microsoft.com/kb/307996?wa=wsignin1.0) ** वह होना चाहिए जो आप खोज रहे हैं। यदि ऐसा है, तो मैं अपना जवाब अपडेट करूंगा –

6

@HonzaBrestan के लिए धन्यवाद, जिन्होंने मुझे HTTP मॉड्यूल विचार के साथ सही रास्ते पर रखा, मैं इस तरह के समाधान के साथ आया, जिसे मैं किसी और के लिए उपयोगी होने पर साझा करना चाहता हूं।

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Web; 

public class ExpirationModule : IHttpModule { 

    HttpApplication _context; 

    #region static initialization for this example - this should be a config section 

    static Dictionary<string, TimeSpan> ExpirationTimes; 
    static TimeSpan DefaultExpiration = TimeSpan.FromMinutes(15); 
    static CrlExpirationModule() {  
     ExpirationTimes = new Dictionary<string, TimeSpan>(); 
     ExpirationTimes["~/SOMEFOLDER/SOMEFILE.XYZ"] = TimeSpan.Parse("0.0:30"); 
     ExpirationTimes["~/ANOTHERFOLDER/ANOTHERFILE.XYZ"] = TimeSpan.Parse("1.1:00"); 
    } 

    #endregion 

    public void Init(HttpApplication context) { 
     _context = context; 
     _context.EndRequest += ContextEndRequest; 
    } 

    void ContextEndRequest(object sender, EventArgs e) { 
     // don't use Path as it contains the application name 
     string requestPath = _context.Request.AppRelativeCurrentExecutionFilePath; 
     string expirationTimesKey = requestPath.ToUpperInvariant(); 
     if (!ExpirationTimes.ContainsKey(expirationTimesKey)) { 
      // not a file we manage 
      return; 
     } 
     string physicalPath = _context.Request.PhysicalPath; 
     if (!File.Exists(physicalPath)) { 
      // we do nothing and let IIS return a regular 404 response 
      return; 
     } 
     FileInfo fileInfo = new FileInfo(physicalPath); 
     DateTime expirationTime = fileInfo.LastWriteTimeUtc.Add(ExpirationTimes[expirationTimesKey]); 
     if (expirationTime <= DateTime.UtcNow) { 
      expirationTime = DateTime.UtcNow.Add(DefaultExpiration); 
     } 
     _context.Response.Cache.SetExpires(expirationTime); 
    } 

    public void Dispose() { 
    } 

} 

फिर आप वेब config में मॉड्यूल जोड़ने की जरूरत है (IIS 7):

<system.webServer> 
    <modules> 
    <add name="ExpirationModule" type="ExpirationModule"/> 
    </modules> 
</system.webServer>