2017-10-13 45 views
14

Chúng tôi phục vụ tập tin cho một trang web từ ASP NET Web API của chúng tôi:Enable nén HTTP với ASP.NET Web API

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var clientHostname = System.Configuration.ConfigurationManager.AppSettings["ClientHostname"]; 

     var staticFileOptions = new StaticFileOptions() 
     { 
      OnPrepareResponse = staticFileResponseContext => 
      { 
       staticFileResponseContext.OwinContext.Response.Headers.Add("Cache-Control", new[] { "public", "max-age=0" }); 
      } 
     }; 

     app.MapWhen(ctx => ctx.Request.Headers.Get("Host").Equals(clientHostname), app2 => 
     { 
      app2.Use((context, next) => 
      { 
       if (context.Request.Path.HasValue == false || context.Request.Path.ToString() == "/") // Serve index.html by default at root 
       { 
        context.Request.Path = new PathString("/Client/index.html"); 
       } 
       else // Serve file 
       { 
        context.Request.Path = new PathString($"/Client{context.Request.Path}"); 
       } 

       return next(); 
      }); 

      app2.UseStaticFiles(staticFileOptions); 
     }); 
    } 
} 

Tôi muốn để cho phép nén HTTP. Theo số this MSDN documentation

Sử dụng công nghệ nén phản hồi dựa trên máy chủ trong IIS, Apache hoặc Nginx nơi hiệu suất của phần mềm trung gian có thể không khớp với mô-đun máy chủ. Sử dụng ứng Compression Middleware khi bạn không thể sử dụng:

  • IIS Nén gọn năng động mô-đun

  • Apache mod_deflate mô-đun

  • nginx nén và giải nén

  • HTTP.sys máy chủ (trước đây gọi là WebListener)

  • Kestrel

Vì vậy, tôi nghĩ cách đầu tiên thích hợp nhất để làm điều này trong ví dụ của tôi là với Mô-đun nén động IIS. Theo đó, tôi đã cố gắng này trong Web.config của tôi, như một thử nghiệm, sau this example:

<configuration> 
    <system.webServer> 
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> 
     <dynamicTypes> 
     <add mimeType="*/*" enabled="true" /> 
     </dynamicTypes> 
     <staticTypes> 
     <add mimeType="*/*" enabled="true" /> 
     </staticTypes> 
    </httpCompression> 
    </system.webServer> 
</configuration> 

Tuy nhiên, các tiêu đề phản ứng này không bao gồm Content-Encoding, vì vậy tôi không tin nó đã được nén. Tôi đang thiếu gì? Làm thế nào tôi có thể thiết lập để phục vụ với nén theo cách tốt nhất có thể?

Tôi đã xác minh rằng khách hàng của tôi đang gửi tiêu đề Accept-Encoding của gzip, deflate, br.

Cập nhật

Tôi đã thử cài đặt Nén HTTP động trong IIS vì không được cài đặt theo mặc định. Dường như với tôi, tôi đang cố gắng phân phát nội dung tĩnh, nhưng tôi nghĩ rằng điều này đáng để thử. Tôi đã xác minh rằng cả nén nội dung tĩnh và động đều được kích hoạt trong IIS Manager. Tuy nhiên, tôi lại chạy nó nhưng vẫn không nén.

Cập nhật 2

Tôi nhận ra rằng nén đang hoạt động trên máy chủ Azure của chúng tôi nhưng vẫn không với IIS cục bộ của tôi.

+1

Thay vì ký tự đại diện cho tất cả các loại, bạn đã thử loại mime cụ thể trong cấu hình chưa? – Jasen

+1

@Jasen Có, tôi có, rất tiếc là không có kết quả. –

Trả lời

2

Tôi đã thử khởi động của bạn trong một dự án web 4.7 .NET trống và tôi nhận được nén, ít nhất là trên index.html. Tôi đã cài đặt tính năng nén động, thêm vài gói Owin, web.config bên dưới, v.v. để làm cho nó hoạt động. Sử dụng IIS/10

packages.config

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" targetFramework="net47" /> 
    <package id="Microsoft.Net.Compilers" version="2.1.0" targetFramework="net47" developmentDependency="true" /> 
    <package id="Microsoft.Owin" version="3.1.0" targetFramework="net47" /> 
    <package id="Microsoft.Owin.FileSystems" version="3.1.0" targetFramework="net47" /> 
    <package id="Microsoft.Owin.Host.SystemWeb" version="3.1.0" targetFramework="net47" /> 
    <package id="Microsoft.Owin.StaticFiles" version="3.1.0" targetFramework="net47" /> 
    <package id="Owin" version="1.0" targetFramework="net47" /> 
</packages> 

Web.config (làm việc cho tôi mà không httpCompression)

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    https://go.microsoft.com/fwlink/?LinkId=169433 
    --> 
<configuration> 
    <appSettings> 
    <add key="ClientHostname" value="localhost" /> 
    <add key="owin:appStartup" value="WebApplication22.App_Start.Startup" /> 
    </appSettings> 
    <system.web> 
    <compilation targetFramework="4.7" /> 
    <httpRuntime targetFramework="4.7" /> 
    </system.web> 
    <system.codedom> 
    <compilers> 
     <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" /> 
     <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" /> 
    </compilers> 
    </system.codedom> 
    <system.webServer> 
    <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> 
     <dynamicTypes> 
     <add mimeType="*/*" enabled="true" /> 
     </dynamicTypes> 
     <staticTypes> 
     <add mimeType="*/*" enabled="true" /> 
     </staticTypes> 
    </httpCompression> 
    </system.webServer> 
</configuration> 

Startup.cs (viết tắt)

using Microsoft.Owin; 
using Microsoft.Owin.StaticFiles; 
using Owin; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace WebApplication22.App_Start 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var clientHostname = System.Configuration.ConfigurationManager.AppSettings["ClientHostname"]; 

      var staticFileOptions = new StaticFileOptions() 
      { 
       OnPrepareResponse = staticFileResponseContext => 
       { 
        staticFileResponseContext.OwinContext.Response.Headers.Add("Cache-Control", new[] { "public", "max-age=0" }); 
       } 
      }; 
      ... 
      } 
    } 
} 

đáp ứng

HTTP/1.1 200 OK 
Cache-Control: public,max-age=0 
Content-Type: text/html 
Content-Encoding: gzip 
Last-Modified: Tue, 17 Oct 2017 22:03:20 GMT 
ETag: "1d347b5453aa6fa" 
Vary: Accept-Encoding 
Server: Microsoft-IIS/10.0 
X-Powered-By: ASP.NET 
Date: Wed, 18 Oct 2017 02:27:34 GMT 
Content-Length: 588 
... 
0

Tôi đã tìm thấy ba nguồn lực để thể hữu ích trong việc cấu hình nén động cho IIS trên một trong hai ASP.Net WCF và các trang Web API. Tôi đoán nó cũng làm việc cho. Net Core nhưng tôi chưa thử. Hai đầu tiên là một chút cũ nhưng nguyên tắc vẫn áp dụng:

https://blog.arvixe.com/how-to-enable-gzip-on-iis7/

https://www.hanselman.com/blog/EnablingDynamicCompressionGzipDeflateForWCFDataFeedsODataAndOtherCustomServicesInIIS7.aspx

https://docs.microsoft.com/en-us/iis/configuration/system.webserver/httpcompression/

Cụ thể:

  • Có, bạn cần module động HTTP nén được cài đặt trong IIS và đã bật
  • Đảm bảo rằng nén động được kiểm tra trong IIS Manager dưới [Máy ​​chủ của bạn]/Nén: Enable Dynamic Compression
  • đúp kiểm tra xem loại MIME trong tiêu đề yêu cầu của khách hàng được bổ sung cụ thể trong Configuration Editor dưới system.webServer/httpCompression/dynamicTypes/, và rằng các loại xử lý' Enabled tài sản được thiết lập để True
  • Thêm các mục web.config như được nêu trong các liên kết ở trên và câu trả lời khác
0

lẽ nhiều nhất này những gì đang mất tích trên Windows Server của bạn (tôi giả sử bạn làm việc trên máy chủ Os) đang cài đặt Web Các tính năng của IIS Server Performance trong đó có hai mô-đun con có thể được cài đặt: Static Content ConpressionDynamic Content Compression.

Để kiểm tra xem chúng được cài đặt chạy Server Manager, chọn Add Roles and Features, chọn ví dụ của bạn, trong màn hình Server Roles mở rộng các nút cây Web Server (IIS), Web Server, Performance và xác minh nếu hộp kiểm cho thấy Static Content ConpressionDynamic Content Compression được cài đặt nếu không kiểm tra chúng và tiếp tục cài đặt tính năng. Sau đó lặp lại tất cả các bước thiết lập cho cấu hình nén tĩnh và động trong IIS Manager và trong các thiết lập Web Site. Nó sẽ hoạt động ngay bây giờ.

+0

Hệ điều hành của tôi là Windows 10 Home, vì vậy tôi không chắc chắn nơi tìm Trình quản lý máy chủ? –

+0

OK nó thay đổi vấn đề một chút và làm cho câu trả lời trên của tôi vô ích. Để kiểm tra xem bạn có yêu cầu chức năng trong IIS được cài đặt vào Control Panel -> Program and Features -> Bật hoặc tắt tính năng Windows -> tìm nút Internet Information Services và mở rộng nó -> mở rộng nút World Wide Web Services -> mở rộng nút - và xác minh rằng cả hai hộp kiểm cho Nén nội dung động và tĩnh đều được chọn -> nếu không kiểm tra chúng và tiến hành cài đặt. –