2013-06-10 17 views
8

Sto tentando di abilitare GZip compress per SVG in un sito Web di Azure utilizzando le trasformazioni di web.config senza esito positivo. Ecco ciò che il mio trasformare assomiglia:Attivare la compressione GZip per SVG nei siti Web di Azure?

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <system.webServer> 
    <httpCompression> 
     <staticTypes> 
     <add mimeType="image/svg+xml" enabled="true" xdt:Transform="Insert" /> 
     </staticTypes> 
    </httpCompression> 
    <staticContent xdt:Transform="Insert"> 
     <mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> 
    </staticContent> 
    </system.webServer> 
</configuration> 

Questo dovrebbe sia aggiungere il tipo MIME per SVG, che Azure non sembra avere, e quindi attivare la compressione. Ho verificato il tipo MIME Inoltre funziona bene, ma al momento della pubblicazione ottengo un errore per gli elementi di compressione:

Nessun elemento nel documento sorgente corrisponde '/configuration/system.webServer/httpCompression/staticTypes'

Rimuovere la compressione dalla trasformazione e aggiungerla direttamente al mio file web.config rimuove l'errore, ma non vedo ancora la compressione nelle intestazioni HTTP. Qui ci sono le intestazioni di risposta:

Accept-Ranges:bytes 
Content-Length:23265 
Content-Type:image/svg+xml 
Date:Mon, 10 Jun 2013 17:19:37 GMT 
ETag:"c4e9ec93d765ce1:0" 
Last-Modified:Mon, 10 Jun 2013 12:39:41 GMT 
Server:Microsoft-IIS/8.0 
X-Powered-By:ASP.NET 
X-Powered-By:ARR/2.5 
X-Powered-By:ASP.NET 

risposta

4

Ecco come è possibile attivare nel tuo web.config :

<configuration> 
    <system.webServer> 
     <staticContent> 
     <mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> 
     </staticContent> 
     <httpCompression> 
     <staticTypes> 
      <remove mimeType="*/*" /> 
      <add mimeType="image/svg+xml" enabled="true" /> 
      <add mimeType="*/*" enabled="false" /> 
     </staticTypes> 
     </httpCompression> 
    </system.webServer> 
</configuration> 

La riga chiave è la rimozione del catch-all (e in seguito aggiunge nuovamente). Se non lo hai, allora la linea svg viene fondamentalmente ignorata poiché il catch-all è ereditato da applicationhost.config, e prende tutto prima che raggiunga la linea svg.

+1

Non sono stato in grado di comprimere il mio svg dall'alto metodo? qualsiasi altra cosa ho bisogno di esaminare? – brykneval

0

ho le seguenti voci di configurazione per un Azure Web-Site:

<system.webServer> 
     <urlCompression doStaticCompression="true" doDynamicCompression="true" /> 
    </system.webServer> 

e

<mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> 
    <!-- Scalable Vector Graphics iPhone, iPad --> 
    <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" /> 

ho aggiunto l'estensione .svgz pure (per svg compresso).

1

Sfortunatamente non è possibile utilizzare la compressione http integrata su Siti Web di Azure per i tipi di mimo image/xml+svg. È necessario modificare alcune impostazioni IIS per fare ciò che è possibile se si sta utilizzando Ruoli Web di Azure.

Non volevo passare attraverso questa seccatura, tuttavia ho creato un controller in MVC per gestire i file .svg.

[AttributeRouting.RoutePrefix("static")] 
public class ContentController : Controller 
{ 
    [GET(@"fonts/{fileName:regex(^[\w-\.]+\.svg$)}")] 
    [Compress, OutputCache(
     Duration = 3600 * 24 * 30, 
     Location = OutputCacheLocation.Any, 
     VaryByContentEncoding = "gzip;deflate", 
     VaryByParam = "fileName")] 
    public ActionResult SvgFont(string fileName) 
    { 
     var path = Server.MapPath("~/Content/fonts/" + fileName); 
     if (!System.IO.File.Exists(path)) return HttpNotFound(); 
     return File(path, "image/svg+xml"); 
    } 
} 

public class CompressAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.HttpContext.CompressResult(); 
    } 
} 

public static class HttpContextExtensions 
{ 
    public static bool CompressResult(this HttpContextBase context) 
    { 
     var request = context.Request; 
     var response = context.Response; 
     if (request == null || response == null) return false; 
     var filter = response.Filter; 
     if (filter is GZipStream || filter is DeflateStream) return false; 
     var acceptEncoding = (request.Headers["Accept-Encoding"] ?? string.Empty).ToLowerInvariant(); 
     if (acceptEncoding.Contains("gzip")) 
     { 
      response.Filter = new GZipStream(filter, CompressionMode.Compress); 
      response.AddHeader("Content-Encoding", "gzip"); 
      response.AppendHeader("Vary", "Content-Encoding"); 
      return true; 
     } 
     if (acceptEncoding.Contains("deflate")) 
     { 
      response.Filter = new DeflateStream(filter, CompressionMode.Compress); 
      response.AddHeader("Content-Encoding", "deflate"); 
      response.AppendHeader("Vary", "Content-Encoding"); 
      return true; 
     } 
     return false; 
    } 
} 

Sarà inoltre necessario aggiungere questo al file web.config in modo che MVC gestirà le rotte con l'estensione Svg

<system.webServer> 
    <handlers> 
    <add name="StaticMvcHandler" path="static/fonts/*.svg" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
</system.webServer> 
+0

grazie mille: questo è stato l'unico modo che ha funzionato per me sui siti Web di Azure (non quello di Webrole). – Sha

+0

'acceptEncoding.Contains (" defalte ")' -> Typo – Cerbrus

+0

correggere l'errore di battitura. grazie –

0

La soluzione di cui sopra ha funzionato per me, ma prima ho dovuto rimuovere l'estensione del file. Dopo di ciò ho ottenuto i risultati che stavo cercando.

<staticContent>   
    <remove fileExtension=".svg" /> 
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> 
</staticContent>