Включить сжатие GZip для SVG на веб-сайтах Azure?

Я безуспешно пытаюсь включить сжатие GZip для SVG на веб-сайте Azure с помощью преобразований web.config. Вот как выглядит мое преобразование:

<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>

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

Ни один элемент в исходном документе не соответствует '/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

person Brian Vallelunga    schedule 10.06.2013    source источник


Ответы (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 в основном игнорируется, поскольку все уловки наследуются от applicationhost.config и улавливают все до того, как дойдут до строки svg.

person David Ebbo    schedule 05.08.2014
comment
Мне не удалось заархивировать мой SVG с помощью вышеуказанного метода? что-нибудь еще, что мне нужно изучить? - person Sandip Bantawa; 20.03.2015

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

Однако я не хотел сталкиваться с этой проблемой, поэтому я просто создал контроллер в 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>
person Brandon Cuff    schedule 01.06.2014
comment
Большое спасибо - это был единственный способ, который сработал для меня на веб-сайтах Azure (не веб-роль). - person Sha; 13.01.2015

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

    <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).

person awsomedevsigner    schedule 02.05.2014

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

<staticContent>        
    <remove fileExtension=".svg" />
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
</staticContent>
person Manuel Orozco    schedule 21.07.2017