2009-02-16 9 views
72

मैं अपने एएसपीनेट पेज (मेरे सीएसएस और जेएस फाइलों सहित) के लिए जीजेपी संपीड़न को लागू करने की कोशिश कर रहा हूं। मैं निम्नलिखित कोड की कोशिश की, लेकिन यह केवल मेरी .aspx पेज (YSlow से यह पाया)ASP.NET में GZip संपीड़न को कैसे कार्यान्वित करें?

HttpContext context = HttpContext.Current; 
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); 
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); 
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true; 

ऊपर कोड केवल मेरे .aspx पेज कोड (मार्कअप) नहीं CSS और JS फ़ाइलों जो शामिल है को संपीड़ित है संपीड़ित करता है बाहरी फाइलों के रूप में। कृपया मुझे बताएं कि मैं कोड का उपयोग कर ASP.NET में GZip संपीड़न को कैसे कार्यान्वित कर सकता हूं (क्योंकि मैं साझा होस्टिंग सर्वर पर हूं जहां मेरे पास आईआईएस सर्वर कॉन्फ़िगरेशन तक पहुंच नहीं है)। और उपर्युक्त कोड में मुझे अंतिम दो पंक्तियां नहीं मिल रही हैं, उनका उपयोग क्यों किया जाता है और इन पंक्तियों का उद्देश्य क्या है। कृपया समझाएँ!

धन्यवाद

उत्तर

26

जे एस & सीएसएस फ़ाइलों को संपीड़ित करने के लिए आप वास्तव में, आईआईएस स्तर पर है कि संभाल करने के बाद से इन फ़ाइलों ASP.NET क्रम बिना सीधे गाया जाता है।

आप आईएसआई में aspnet_isapi.dll पर एक JSX & सीएसएसएक्स एक्सटेंशन मैपिंग कर सकते हैं और फिर अपने ज़िप कोड का लाभ उठा सकते हैं, लेकिन आईआईएस आपके लिए बेहतर काम करने की संभावना है।

सामग्री-एन्कोडिंग हेडर ब्राउज़र को बताता है कि इसे प्रतिपादन से पहले सामग्री को अनजिप करने की आवश्यकता है। कुछ ब्राउज़र्स सामग्री के आकार के आधार पर इसे समझने के लिए पर्याप्त स्मार्ट हैं, लेकिन बस इसे बताना बेहतर है।

स्वीकार्य-एन्कोडिंग कैश सेटिंग वहां है ताकि gzipped सामग्री का कैश किया गया संस्करण किसी ब्राउज़र पर नहीं भेजा जाएगा जो केवल पाठ/HTML का अनुरोध करता है।

+4

हाय @ बेन, क्या आप कृपया मुझे बता सकते हैं कि आईआईएस का उपयोग करके मेरी फ़ाइलों को कैसे कंप्रेस करना है, मुझे क्या करना है, हालांकि मुझे आईआईएस कॉन्फ़िगरेशन तक पहुंच नहीं है, लेकिन मैं ' इसे करने की कोशिश करेंगे। कृपया मुझे बताएं कि आईआईएस का उपयोग कर फ़ाइलों को कैसे कंप्रेस करें ?? धन्यवाद! – Prashant

+3

http://stackoverflow.com/a/6992948/8479 आईआईएस 7 या उससे अधिक के लिए आवश्यक web.config में सरल परिवर्तन का विवरण देता है। – Rory

2

अपने अंतिम प्रश्न का उत्तर देने के लिए। उन दो पंक्तियों ने ब्राउज़र के लिए भेजे गए प्रतिक्रिया के लिए HTTP शीर्षलेख सेट किए हैं। Content-Encoding ब्राउज़र को बताता है कि प्रतिक्रिया gzip के रूप में एन्कोड की गई है और इसे डीकोड करने की आवश्यकता है। अंतिम पंक्ति Accept-EncodingVary header पर जोड़ती है। इसके साथ ब्राउज़र या प्रॉक्सी निर्धारित कर सकते हैं कि प्रतिक्रिया अद्वितीय थी या कुछ अन्य शीर्षकों से प्रभावित होती है और उनके कैशिंग को समायोजित करती है।

3

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

आईआईएस 7 के बिना, और साझा होस्टिंग के बिना, आपको एक हैंडलर बनाना होगा जो एक .net फ़ाइल एक्सटेन्शन मैप किया गया है जिसे आप उपयोग नहीं कर रहे हैं (जैसे .asmx) और web.config में निर्दिष्ट करें कि .asmx फ़ाइलें आपके पास जाती हैं HttpHandler जो .jpg के पथ को फिर से लिखने के लिए सेट है या जो कुछ भी शीर्षलेख सेट करता है।

11

कारण यह केवल आपकी एएसपीएक्स फ़ाइल को संपीड़ित करने का कारण यह है कि आपके द्वारा लिखे गए कोड को केवल एएसपीएक्स फ़ाइल में एम्बेड किया गया है। एक एएसपीएक्स फ़ाइल इसमें शामिल किसी भी लिंक्ड सामग्री से एक अलग अनुरोध है। इसलिए यदि आप एक ASPX पेज है जिसमें:

    aspx पृष्ठ के लिए
  1. और
  2. के लिए
  3. :

    <img src="www.example.com\exampleimg.jpg" alt="example" /> 
    

    यह संसाधनों के लिए अपने ब्राउज़र से (DNS खोज के एक तरफ) 2 अनुरोध करने के लिए राशि होता एएसपीएक्स पेज द्वारा निहित छवि।

प्रत्येक अनुरोध के पास इसका स्वयं का प्रतिक्रिया भाप है। आपके द्वारा पोस्ट किया गया कोड केवल एएसपीएक्स प्रतिक्रिया स्ट्रीम से जुड़ा हुआ है, यही कारण है कि केवल आपका एएसपीएक्स पृष्ठ संपीड़ित किया जा रहा है।लाइन्स 1 & आपके पोस्ट कोड में से 2 अनिवार्य रूप से पृष्ठ की सामान्य प्रतिक्रिया धारा को ले रहे हैं और कुछ "मध्यम व्यक्ति" कोड इंजेक्ट कर रहे हैं, जो इस मामले में एक जीजीआईपी स्ट्रीम के साथ सामान्य आउटपुट स्ट्रीम खाती है और संपीड़ित करती है और इसके बजाय तार को नीचे भेजती है।

लाइन्स 3 & 4 प्रतिक्रिया शीर्षलेख स्थापित कर रहे हैं। सभी http अनुरोधों और प्रतिक्रियाओं में शीर्षलेख होते हैं जो सामग्री से पहले भेजे जाते हैं। ये अनुरोध/प्रतिक्रिया सेट अप करते हैं ताकि सर्वर और क्लाइंट को पता चल सके कि क्या भेजा जा रहा है और कैसे।

इस मामले में लाइन 3 क्लाइंट ब्राउज़र को सूचित कर रहा है कि प्रतिसाद स्ट्रीम gzip के माध्यम से संपीड़ित है और इसलिए प्रदर्शित होने से पहले क्लाइंट ब्राउज़र द्वारा इसे संपीड़ित करने की आवश्यकता है।

और लाइन 4 प्रतिक्रिया के स्वीकार्य-एन्कोडिंग हेडर पर बस बदल रहा है। यह अन्यथा प्रतिक्रिया से अनुपस्थित रहेगा।

ऐसे प्लगिंग योग्य मॉड्यूल हैं जिन्हें आप लिख सकते हैं/प्राप्त कर सकते हैं जो आपको अन्य एमआईएम प्रकार जैसे * .js और * .css के बहुसंख्यक को संपीड़ित करने की अनुमति देते हैं, लेकिन आप केवल आईआईएस की निर्मित संपीड़न कार्यक्षमता का उपयोग कर बेहतर हैं।

आप नहीं कहा है आईआईएस की जो verson प्रयोग कर रहे हैं लेकिन अगर यह IIS 7.0 थे, उसके लिए आवश्यक है कि आप आप के <system.webserver> अनुभाग web.config फ़ाइल में निम्न की तरह कुछ में शामिल हैं:

<httpCompression> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
<staticTypes> 
     <add mimeType="text/*" enabled="true" /> 
     </staticTypes> 
</httpCompression> 
<urlCompression doStaticCompression="true" /> 

..

रिचर्ड

+0

वास्तव में अजीब विवरण – Rakeshyadvanshi

37

यहाँ CSS और javaScript फ़ाइलों के लिए समाधान है

<httpCompression> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/> 
    <dynamicTypes> 
     <add mimeType="text/*" enabled="true"/> 
     <add mimeType="message/*" enabled="true"/> 
     <add mimeType="application/javascript" enabled="true"/> 
     <add mimeType="*/*" enabled="false"/> 
    </dynamicTypes> 
    <staticTypes> 
     <add mimeType="text/*" enabled="true"/> 
     <add mimeType="message/*" enabled="true"/> 
     <add mimeType="application/javascript" enabled="true"/> 
     <add mimeType="*/*" enabled="false"/> 
    </staticTypes> 
    </httpCompression> 
    <urlCompression doStaticCompression="true" doDynamicCompression="true"/> 
</system.webServer> 

क्रेडिट: How to GZip on ASP.NET and GoDaddy

+0

यह एक काम करता है .. –

+0

चेक की आवश्यकता है .... –

+2

अंतिम पंक्ति को हटाया जाना चाहिए – JeffT

11

यह आपके लिए उपयोगी हो सकता है, यह अस्वीकार करता है और संपीड़न को गीला करता है।

void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 
     string acceptEncoding = app.Request.Headers["Accept-Encoding"]; 
     Stream prevUncompressedStream = app.Response.Filter; 

     if (app.Context.CurrentHandler == null) 
      return; 

     if (!(app.Context.CurrentHandler is System.Web.UI.Page || 
      app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || 
      app.Request["HTTP_X_MICROSOFTAJAX"] != null) 
      return; 

     if (acceptEncoding == null || acceptEncoding.Length == 0) 
      return; 

     acceptEncoding = acceptEncoding.ToLower(); 

     if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") 
     { 
      // deflate 
      app.Response.Filter = new DeflateStream(prevUncompressedStream, 
       CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "deflate"); 
     } 
     else if (acceptEncoding.Contains("gzip")) 
     { 
      // gzip 
      app.Response.Filter = new GZipStream(prevUncompressedStream, 
       CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "gzip"); 
     } 
    } 
+1

इस कोड के लिए बहुत बहुत धन्यवाद। मुझे सामग्री को जीएसआईपी/डिफ्लेट करने की ज़रूरत है, एक विशिष्ट साइट के पास आईआईएस कंसोल तक पहुंच नहीं है और इससे मेरी मदद मिली। हालांकि एक सवाल हालांकि: यह कोड सभी एएसपीएक्स फाइलों को डिफ्लेट करना और सीएसएस और स्क्रिप्ट स्रोतों को gziping प्रतीत होता है, लेकिन यह किसी भी .js फ़ाइलों को gziping नहीं है। क्या ऐसा करने का कोई तरीका है? धन्यवाद। –

+0

यह गलत है, क्योंकि आप इस तरह के गुणवत्ता निर्देश को संभाल नहीं रहे हैं: 'gzip; q = 0, deflate'। http://www.singular.co.nz/2008/07/finding-preferred-accept-encoding-header-in-csharp/ – oligofren

0

.css या .js फ़ाइल में .aspx एक्सटेंशन जोड़ें। सही MIME प्रकार के साथ सेवा करने के लिए <% @ पृष्ठ सामग्री प्रकार = "टेक्स्ट/सीएसएस"%> या फ़ाइल के भीतर जावास्क्रिप्ट का उपयोग करें। & यूआरएल यूजर एजेंट ब्राउजर से इसे छिपाने के लिए यूआरएल का उपयोग करें। सामग्री-एन्कोडिंग प्रतिक्रिया शीर्षलेख को यह बताने के लिए gzip संलग्न किया गया है कि gzip संपीड़न करने के लिए उपयोग की जाने वाली विधि है। वेरी प्रतिक्रिया हेडर का सेट स्वीकृति-एन्कोडिंग पर सेट है ताकि सभी कैश जान सकें कि कौन सा पृष्ठ (संपीड़ित या असम्पीडित) परोसा जाना चाहिए अनुरोध के स्वीकृति-एन्कोडिंग हेडर पर निर्भर करता है। मैंने इस पर https://stackoverflow.com/a/14509007/1624169

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