2013-06-10 5 views
8

Я пытаюсь включить компрессию GZip для SVG на Azure Web Site, используя web.config. Вот то, что мой преобразования выглядит следующим образом:Включить сжатие GZip для SVG на веб-сайтах 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> 

Это должно как добавить тип пантомимы для SVG, который, кажется, не Azure иметь, а затем включить сжатие. Я проверил тип мим дополнение работает отлично, но после публикации я получаю сообщение об ошибке для элементов сжатия:

не

Ни один элемент в исходном документе соответствует «/configuration/system.webServer/httpCompression/staticTypes»

Удаление сжатия из преобразования и добавление его непосредственно в мой файл web.config устраняет эту ошибку, но я до сих пор не вижу сжатия в заголовках HTTP. Вот заголовки ответа:

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 

ответ

4

Вот как вы можете включить его в 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> 

Ключевая строка - удаление уловов (и последующее повторное добавление). Если у вас этого нет, тогда строка svg в основном проигнорируется, поскольку catch-all унаследован от applicationhost.config и улавливает все до того, как он достигнет строки svg.

+1

Мне не удалось закрепить мой метод svg сверху? любую другую вещь, в которой я должен заглянуть? – brykneval

0

У меня есть следующие данные конфигурации для Azure Web-сайт:

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

и

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

Я добавил .svgz расширение, а также (для сжатых svg).

1

К сожалению, невозможно использовать встроенное сжатие http на Azure Сайты для image/xml+svg mime types. Вы должны изменить некоторые настройки IIS, чтобы сделать возможным, если вы используете Azure Web Roles.

Я не хотел проходить эту проблему, поэтому я просто сделал контроллер в MVC для обработки файлов .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; 
    } 
} 

Вам также нужно добавить это в файл Web.config так, что MVC будет обрабатывать маршруты с .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

большое спасибо - это был единственный способ, который работал на меня на сайтах Azure (а не на веб-браузере). – Sha

+0

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

+0

исправить опечатку. спасибо –

0

Вышеупомянутое решение работало для меня, но мне сначала пришлось удалить расширение файла. После этого я получил результаты, которые я искал.

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

 Смежные вопросы

  • Нет связанных вопросов^_^