2013-06-10 26 views
8

Tôi đang cố gắng cho phép nén GZip cho SVG trong một trang web Azure bằng cách sử dụng biến đổi web.config mà không thành công. Dưới đây là những gì biến đổi của tôi trông giống như:Bật tính năng nén GZip cho SVG trong Azure Web Sites?

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

Điều này sẽ thêm cả loại mime cho SVG, mà Azure dường như không có, và sau đó cho phép nén. Tôi đã xác minh các loại mime Ngoài hoạt động tốt, nhưng khi xuất bản tôi nhận được một lỗi cho các yếu tố nén:

Không có phần tử trong tài liệu nguồn phù hợp '/configuration/system.webServer/httpCompression/staticTypes'

Xóa nén khỏi biến đổi và thêm trực tiếp vào tệp web.config của tôi sẽ xóa lỗi, nhưng tôi vẫn không thấy phần nén trong tiêu đề HTTP. Dưới đây là các tiêu đề phản ứng:

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 

Trả lời

4

Đây là cách bạn có thể kích hoạt nó trong web.config của bạn :

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

Dòng khóa là xóa bỏ toàn bộ lưu giữ (và sau đó thêm lại). Nếu bạn không có điều đó, thì dòng svg về cơ bản bị bỏ qua vì catch-all được thừa hưởng từ applicationhost.config, và bắt tất cả trước khi nó đạt đến dòng svg.

+1

Tôi đã không thể zip svg của tôi từ phương pháp trên? bất kỳ điều gì khác tôi cần phải nhìn vào? – brykneval

0

tôi có các mục cấu hình sau đây cho một Azure Web-Site:

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

Tôi đã thêm phần mở rộng .svgz cũng (cho svg nén).

1

Rất tiếc, không thể sử dụng tính năng nén http được tích hợp sẵn trên Trang web Azure cho image/xml+svg loại mime. Bạn phải thay đổi một số cài đặt IIS để thực hiện điều đó nếu bạn đang sử dụng Vai trò web Azure.

Tôi không muốn đi qua rắc rối đó tuy nhiên vì vậy tôi chỉ cần thực hiện một bộ điều khiển trong MVC để xử lý tệp .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; 
    } 
} 

Bạn cũng sẽ cần phải thêm video này vào file Web.config của bạn để MVC sẽ xử lý các tuyến đường có phần mở rộng .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

cảm ơn rất nhiều - đây là cách duy nhất làm việc cho tôi trên trang web Azure (không phải webrole một). – Sha

+0

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

+0

sửa lỗi đánh máy. thanks –

0

Giải pháp trên đã hiệu quả đối với tôi nhưng trước tiên tôi phải xóa phần mở rộng của tệp. Sau đó tôi nhận được kết quả mà tôi đang tìm kiếm.

<staticContent>   
    <remove fileExtension=".svg" /> 
    <mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> 
</staticContent> 
Các vấn đề liên quan