2012-12-13 24 views
5

C'è un modo per ottenere Azure Web Sites per servire contenuti gzip per richieste da un proxy HTTP 1.0 come Amazon Web Services CloudFront? Prendere in considerazione una richiesta del genere:compressione gzip per richieste proxy HTTP 1.0 su siti Web di Azure

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

Sembra che il modo generale di compiere è quello di aggiungere il seguente elemento system.webServer:

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

Sembra inoltre che httpCompression is only valid in ApplicationHost.config e non web.config il che significa che non è sovrascrivibile nei siti Web di Azure.

Qualche suggerimento per soluzioni alternative?

risorse aggiuntive:

risposta

0

Il modulo HTTP auto-magico che svolge il lavoro è presentato di seguito. Devi registrarlo nel tuo file 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; 
     } 
    } 
} 

Il modulo è progettato per funzionare con IIS 7.0 o superiore in modalità pipeline integrata (siti web Azure hanno esattamente questa out of the box). Questa è la configurazione più diffusa, quindi in genere funziona solo dopo averla allegata. Si prega di notare che il modulo dovrebbe essere il primo di una lista di moduli.

web.config campione di registrazione:

<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 non comprime per richieste HTTP/1.0. È possibile ignorare questo comportamento impostando:

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