ASP.NET में GZip संपीड़न कैसे लागू करें?


81

मैं अपने asp.net पेज (मेरे सीएसएस और जेएस फाइलों सहित) के लिए GZip संपीड़न को लागू करने की कोशिश कर रहा हूं। मैंने निम्नलिखित कोड की कोशिश की, लेकिन यह केवल मेरे .aspx पृष्ठ को संकुचित करता है (इसे YSlow से मिला )

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 संपीड़न कैसे लागू कर सकता हूं (क्योंकि मैं साझा होस्टिंग सर्वर पर हूं जहां मेरे पास IIS सर्वर कॉन्फ़िगरेशन तक पहुंच नहीं है)। और उपरोक्त कोड में भी मुझे अंतिम दो लाइनें नहीं मिल रही हैं, उनका उपयोग क्यों किया जाता है और इन पंक्तियों का उद्देश्य क्या है। कृपया समझाएँ!


काफी डुप्लिकेट नहीं: stackoverflow.com/questions/6992524
jpaugh

जवाबों:


28

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

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

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

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


4
हाय @Ben, क्या आप मुझे बता सकते हैं कि IIS का उपयोग करके मेरी फ़ाइलों को कैसे संपीड़ित किया जाए, मुझे कौन सी सेटिंग्स का प्रदर्शन करना है, हालांकि मेरे पास IIS कॉन्फ़िगरेशन तक पहुंच नहीं है, लेकिन मैं इसे करने की कोशिश करूंगा। कृपया मुझे बताओ कि IIS का उपयोग करके फ़ाइलों को कैसे संपीड़ित किया जाए ?? धन्यवाद!
प्रशांत

4
stackoverflow.com/a/6992948/8479 IIS7 या अधिक से अधिक के लिए web.config के लिए सरल परिवर्तन का विवरण देता है।
रोरी

47

यहाँ सीएसएस और जावास्क्रिप्ट फ़ाइलों के लिए समाधान है। निम्न कोड को अपने web.config फ़ाइल के अंदर <system.webServer> में जोड़ें:

<configuration>
  ...
  <system.webserver>
     ...
      <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>
  ...
<configuration>

क्रेडिट: ASP.NET और GoDaddy पर GZip कैसे करें


4
अंतिम पंक्ति को हटा दिया जाना चाहिए
जेएफटी

1
सच है, लेकिन मैं वास्तव में शुरुआती <system.webServer> जोड़ूंगा ... तो हम जानते हैं कि कॉन्फ़िगरेशन कहाँ रखा जाना चाहिए।
कार्लोस आर बालेबोना

मैंने समान कोड जोड़ा, लेकिन फाइलें संकुचित नहीं हो रही हैं
जीशान अहमद खलील

क्या मुझे कुछ और जोड़ने की आवश्यकता है?
जीशान अहमद खलील

16

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

    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");
        }
    } 

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

यह गलत है, क्योंकि आप इस तरह से गुणवत्ता निर्देश नहीं दे रहे हैं gzip;q=0,deflate:। singular.co.nz/2008/07/…
oligofren

11

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

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

यह आपके ब्राउज़र से संसाधनों तक 2 अनुरोधों (DNS लुकअप को एक तरफ) तक ले जाएगा:

  1. aspx पृष्ठ के लिए और
  2. आकांक्षा पृष्ठ द्वारा निहित छवि के लिए।

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

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

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

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

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

आपने यह नहीं कहा है कि आप आईआईएस का कौन सा प्रयोग कर रहे हैं, लेकिन यदि यह 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" /> 

..

रिचर्ड


वास्तव में awsome विवरण
Rakeshyadvanshi

3

IIS7 में सभी अनुरोध .net पर जाते हैं, इसलिए आपको एक HttpModule बनाना होगा जिसने उन हेडर को सभी प्रतिक्रियाओं में जोड़ा हो।

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


2

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


0

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


0

आप <system.webServer>तत्व में केवल अपनी web.config फ़ाइल में निम्नलिखित जोड़ सकते हैं :

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

नोट: यदि आप IIS (v7.5 से कम) के पुराने संस्करण का उपयोग कर रहे हैं, तो आप प्रक्रिया को गहन बनाने के लिए doDynamicCompression को झूठा सेट करना चाह सकते हैं। IIS 7.5 में इन समस्याओं को हटा दिया गया था।

संदर्भ: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urligression


0

या तो इसे web.config फ़ाइल के साथ करें

<system.webServer>
    <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>

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.