11

मैंने एएसपी.NET एमवीसी आउटपुट में GZIP/DEFLATE संपीड़न जोड़ने के लिए कई विकल्प देखे हैं, लेकिन वे सभी संपीड़न ऑन-द-फ्लाई लागू करते हैं .. इस प्रकार नहीं संपीड़ित सामग्री कैशिंग की सलाह ले लो।एएसपी.नेट एमवीसी - संपीड़न + कैशिंग

संपीड़ित पृष्ठ आउटपुट के कैशिंग को सक्षम करने के लिए कोई समाधान? पसंदीदा रूप से कोड में, ताकि एमवीसी कोड जांच सके कि पृष्ठ बदल गया है या नहीं, और अगर नहीं, तो प्रीकंप्रेस्ड कैश की गई सामग्री को बाहर भेज दें।

यह प्रश्न वास्तव में नियमित asp.net पर भी लागू हो सकता है।

+0

आप 'System.Web.Cache' में संकुचित प्रतिसाद ग्रहण की तरह मतलब है? – bzlm

+0

शायद, या कोई अन्य समाधान जो इसे पूरा करता है। –

+0

अब तक कोई भी उत्तर नहीं है, जबकि अन्य मामलों में जानकारीपूर्ण, कैश बनाम सामग्री _in_ कैश बनाम सामग्री ___ को कैश बना रहा है। एएसपी.नेट कैशिंग पर एक यूजी प्रेजेंटेशन पर विचार करते हुए, क्या आपने कस्टम कैश प्रदाता लिखने पर विचार किया है? – J0e3gan

उत्तर

4
[Compress] 
[OutputCache(Duration = 600, VaryByParam = "*", VaryByContentEncoding="gzip;deflate")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+2

इस पर कोई दस्तावेज? ऐसा लगता है कि मैं क्या कर रहा हूँ। –

+0

मुझे इस पर अधिक जानकारी देखना अच्छा लगेगा, मैं "संपीड़न" अटारी काम करने में सक्षम हूं –

0

आप एक कैश गुण बना सकते हैं:

public class CacheAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 

     if (Enabled) 
     { 
      cache.SetExpires(System.DateTime.Now.AddDays(30)); 
     } 
     else 
     { 
      cache.SetCacheability(HttpCacheability.NoCache); 
      cache.SetNoStore(); 
     } 
    } 

    public bool Enabled { get; set; } 

    public CacheAttribute() 
    { 
     Enabled = true; 
    } 
} 
+0

यह संपीड़न को कैसे संभालता है? –

+0

क्षमा करें, प्रश्न के उस हिस्से को गलत समझा। आप इसे http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx देख सकते हैं। यह अभी भी फ्लाई संपीड़न पर कर रहा है, लेकिन इसकी विशेषता-आधारित आपको अधिक पसंद प्रदान करती है और एक सर्वर-व्यापी समाधान विकल्प चुनती है। –

0

विषय पर एक पूर्ण परिचय के लिए Improving performance with output caching देखें। मुख्य सिफारिश the Action पर [OutputCache] विशेषता का उपयोग करना है, जिस पर कैशिंग लागू की जानी चाहिए।

+2

हालांकि संपीड़न का उल्लेख नहीं देखते हैं? –

3

गुणों (एमवीसी के लिए) का उपयोग करके कैशिंग विकल्प का उपयोग करें, और संपीड़न के बारे में मत सोचें क्योंकि आईआईएस/IISExpress स्वचालित रूप से आपके आउटपुट को संपीड़ित करता है यदि आप इसे सक्षम करते हैं।

जिस तरह से यह काम करता है, एमवीसी अलग-अलग टुकड़ों या आउटपुट के हिस्सों (आंशिक सामग्री कैशिंग) के कैशिंग को सक्षम नहीं करता है। यदि आप इसे चाहते हैं, तो क्लाउडफ्लेयर जैसी सेवा का उपयोग करने पर विचार करें (क्या सीएफ की तरह कोई अन्य है?)। यह स्वचालित रूप से आपके आउटपुट को कैश करता है और आपके आउटपुट के टुकड़ों को कैश करता है और आपके कोड में बदलाव किए बिना कई अन्य प्रदर्शन और सुरक्षा सुधार प्रदान करता है।

यदि यह आपके लिए कोई विकल्प नहीं है, तो आप अभी भी आईस्पेड का उपयोग कर सकते हैं (यह Google के mod_pagespeed का आईआईएस पोर्ट है)। यह कुछ रोचक सेटिंग्स जैसे व्हाइटस्पेस हटाने, इनलाइन सीएसएस और जेएस संपीड़न, जेएस फ़ाइल विलय और कई अन्य प्रदान करता है।

दोनों सीएफ और आईस्पीड परवाह नहीं है कि आपकी साइट कैसे बनाई गई है, वे http/html स्तर पर काम करते हैं, इसलिए वे दोनों एमवीसी, क्लासिक एएसपी.नेट, पीएचपी या यहां तक ​​कि कच्चे एचटीएमएल फाइलों पर भी काम करते हैं।

+1

एक आखिरी वाला, सावधान रहें जब आप 'वेरी' का उपयोग करते हैं क्योंकि यह कुछ पुराने आईई संस्करणों के कैशिंग व्यवहार को तोड़ सकता है। – edokan

1

आप की तरह

public class EnableCompressionAttribute : ActionFilterAttribute 
{ 
    const CompressionMode Compress = CompressionMode.Compress; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase request = filterContext.HttpContext.Request; 
     HttpResponseBase response = filterContext.HttpContext.Response; 
     string acceptEncoding = request.Headers["Accept-Encoding"]; 
     if (acceptEncoding == null) 
      return; 
     else if (acceptEncoding.ToLower().Contains("gzip")) 
     { 
      response.Filter = new GZipStream(response.Filter, Compress); 
      response.AppendHeader("Content-Encoding", "gzip"); 
     } 
     else if (acceptEncoding.ToLower().Contains("deflate")) 
     { 
      response.Filter = new DeflateStream(response.Filter, Compress); 
      response.AppendHeader("Content-Encoding", "deflate"); 
     } 
    } 
} 

एक विशेषता Global.asax.cs बना सकते हैं में प्रविष्टि जोड़ें

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      filters.Add(new EnableCompressionAttribute()); 
     } 

तो फिर तुम के रूप में इस विशेषता का उपयोग कर सकते हैं:

[EnableCompression] 
    public ActionResult WithCompression() 
    { 
     ViewBag.Content = "Compressed"; 
     return View("Index"); 
    } 

आप गीथूब से काम कर रहे उदाहरण डाउनलोड कर सकते हैं: https://github.com/ctesene/TestCompressionActionFilter

+0

यह प्रत्येक अनुरोध को पुनः संयोजित करने के बजाय ** कैशिंग ** पृष्ठ का संपीड़ित संस्करण का समर्थन करता है? – AaronLS

+0

हां, विशेषता नियंत्रक विधि पर लागू होती है इस प्रकार "प्रतिक्रिया" सर्वर पक्ष से संपीड़ित होती है। मुझे "अनुरोध को फिर से संपीड़ित करने" से आपका क्या मतलब नहीं था। –

+0

प्रत्येक अनुरोध पर संपीड़न होता है या नहीं और इस प्रकार अक्षम है: "अनुरोध प्राप्त हुआ-> कैश किए गए पृष्ठ को पुनर्प्राप्त करें-> कैश्ड पृष्ठ को संपीड़ित करें", बनाम "अनुरोध प्राप्त हुआ-> कैश किए गए पृष्ठ को पुनर्प्राप्त करें (जो पहले ही संपीड़ित है)"। – AaronLS

1

यह link आपको जो चाहिए वह काफी करीब लगता है। यह संपीड़ित गतिशील रूप से जेनरेट किए गए पृष्ठों को कैश करता है। हालांकि उदाहरण वेब प्रपत्रों का उपयोग करता है, यह एक OutputCache का उपयोग करके MVC करने के लिए अनुकूलित किया जा सकता विशेषता

[OutputCache(Duration = 600, VaryByParam = "*", VaryByContentEncoding="gzip;deflate")] 
संबंधित मुद्दे