2012-12-13 12 views
5

のようなHTTP 1.0プロキシからのリクエストに対して、Azure Web Sitesがgzip'edコンテンツを配信する方法はありますか?Azure WebサイトでのHTTP 1.0プロキシリクエストのgzip圧縮

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

またApplicationHost.confighttpCompression is only validないweb.configがあることを意味しているようだ:

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

達成する一般的な方法は、system.webServerに次の要素を追加しているようだ。このような要求を検討Azure Webサイトでは上書きできません。

回避策の提案はありますか?

追加リソース:

答えて

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サイトは、箱から出して、正確にこれを持っています)。これは最も広く普及している設定なので、一般的には一度アタッチすれば動作します。モジュールは、モジュールのリストの最初のものでなければならないことに注意してください。

の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の要求を圧縮しません。 この動作を無効にするには、次のように設定します。

関連する問題