2012-12-13 51 views
5

有沒有辦法讓Azure Web Sites爲來自HTTP 1.0代理的請求提供gzip內容?Amazon Web Services CloudFront?考慮這樣一個要求:針對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" /> 

看來還httpCompression is only validApplicationHost.config,而不是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

IIS不會壓縮爲HTTP/1.0的請求。 您可以通過設置覆蓋此行爲:

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