2012-12-13 47 views
5

क्या Azure Web Sites प्राप्त करने के लिए Amazon Web Services CloudFront जैसे HTTP 1.0 प्रॉक्सी से अनुरोधों के लिए gzip'ed सामग्री की सेवा करने का कोई तरीका है? इस तरह के अनुरोध पर विचार करें:Azure वेब साइट्स पर HTTP 1.0 प्रॉक्सी अनुरोधों के लिए gzip संपीड़न

curl -I -H "accept-encoding: gzip,deflate,sdch" -H "Via: 1.0 {foo.cdn.net}" -0 http://{fooproject}.azurewebsites.net/ 

ऐसा लगता है कि सामान्य तरीके से पूरा करने के लिए system.webServer के लिए निम्न तत्व जोड़ने के लिए है:

<httpCompression noCompressionForHttp10="false" noCompressionForProxies="false" /> 

यह भी लगता है ApplicationHost.config में httpCompression is only valid और नहीं web.config कि जिसका मतलब है कि यह Azure वेब साइट्स पर ओवरराइट करने योग्य नहीं है।

कामकाज के लिए कोई सुझाव?

अतिरिक्त संसाधन:

उत्तर

0

नौकरी करने वाले ऑटो-जादुई HTTP मॉड्यूल नीचे प्रस्तुत किया गया है। आपको इसे अपनी Web.config फ़ाइल में पंजीकृत करने की आवश्यकता है।

/// <summary> 
/// Provides HTTP compression support for CDN services when 
/// ASP.NET website is used as origin. 
/// </summary> 
public sealed class CdnHttpCompressionModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += Context_PreRequestHandlerExecute; 
    } 

    public void Dispose() 
    { 
    } 

    void Context_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     var application = (HttpApplication)sender; 
     var request = application.Request; 
     var response = application.Response; 

     // --------------------------------------------------------------------- 

     bool allowed = false; 

     string via = request.Headers["Via"]; 
     if (!string.IsNullOrEmpty(via)) 
     { 
      if (via.Contains(".cloudfront.net")) 
      { 
       // Amazon CloudFront 
       allowed = true; 
      } 

      // HINT: You can extend with other criterias for other CDN providers. 
     } 

     if (!allowed) 
      return; 

     // --------------------------------------------------------------------- 

     try 
     { 
      if (request["HTTP_X_MICROSOFTAJAX"] != null) 
       return; 
     } 
     catch (HttpRequestValidationException) 
     { 
     } 

     // --------------------------------------------------------------------- 

     string acceptEncoding = request.Headers["Accept-Encoding"]; 
     if (string.IsNullOrEmpty(acceptEncoding)) 
      return; 

     string fileExtension = request.CurrentExecutionFilePathExtension; 
     if (fileExtension == null) 
      fileExtension = string.Empty; 
     fileExtension = fileExtension.ToLowerInvariant(); 

     switch (fileExtension) 
     { 
      case "": 
      case ".js": 
      case ".htm": 
      case ".html": 
      case ".css": 
      case ".txt": 
      case ".ico": 
       break; 

      default: 
       return; 
     } 

     acceptEncoding = acceptEncoding.ToLowerInvariant(); 
     string newContentEncoding = null; 

     if (acceptEncoding.Contains("gzip")) 
     { 
      // gzip 
      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
      newContentEncoding = "gzip"; 
     } 
     else if (acceptEncoding.Contains("deflate")) 
     { 
      // deflate 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
      newContentEncoding = "deflate"; 
     } 

     if (newContentEncoding != null) 
     { 
      response.AppendHeader("Content-Encoding", newContentEncoding); 
      response.Cache.VaryByHeaders["Accept-Encoding"] = true; 
     } 
    } 
} 

मॉड्यूल एकीकृत पाइपलाइन मोड में IIS 7.0 या उच्चतर के साथ काम करने के लिए डिज़ाइन किया गया है (Azure वेबसाइटें बॉक्स से बाहर वास्तव में यह है)। यह सबसे व्यापक कॉन्फ़िगरेशन है, इसलिए आम तौर पर इसे संलग्न करने के बाद यह केवल काम करता है। कृपया ध्यान दें कि मॉड्यूल मॉड्यूल की सूची में पहला होना चाहिए।

Web.config पंजीकरण नमूना:

<configuration> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="CdnHttpCompressionModule" preCondition="managedHandler" type="YourWebsite.Modules.CdnHttpCompressionModule, YourWebsite" /> 
     <!-- You may have other modules here --> 
    </modules> 
    <system.webServer> 
</configuration> 
1

आईआईएस HTTP/1.0 अनुरोधों के लिए सेक नहीं होंगे। आप इस व्यवहार को सेट करके ओवरराइड कर सकते हैं:

appcmd set config -section:system.webServer/httpCompression /noCompressionForHttp10:"False"