2017-10-13 98 views
14

我們服務的文件從我們的ASP .NET的Web API網站HTTP壓縮:與啓用的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); 
     }); 
    } 
} 

我想啓用HTTP壓縮。根據this MSDN documentation

在IIS,Apache或Nginx中使用基於服務器的響應壓縮技術,其中中間件的性能可能與服務器模塊的性能不匹配。使用響應壓縮中間件,當你無法使用:

  • IIS動態壓縮模塊

  • Apache的mod_deflate模塊模塊

  • NGINX壓縮和解壓

  • HTTP.sys在服務器(以前稱爲WebListener)

  • 紅隼

所以我覺得第一個可取的方法在我的情況下做到這一點是與IIS動態壓縮模塊。因此,我想這在我的web.config,作爲測試,以下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> 

然而,響應頭不包括Content-Encoding,所以我不相信它被壓縮。我錯過了什麼?我怎樣才能以最好的方式將它設置爲以壓縮方式提供服務?

我確認我的客戶正在發送一個Accept-Encoding標頭gzip, deflate, br

更新

我試圖在IIS安裝動態HTTP壓縮,因爲它不是默認安裝的。在我看來,我試圖靜態地提供內容,但我認爲這值得一試。我驗證了在IIS管理器中啓用了靜態和動態內容壓縮。但是,我重新運行它,但仍然沒有壓縮。

更新2

我意識到壓縮的工作我們Azure的服務器上,但仍無法與我的本地IIS。

+1

而不是所有類型的通配符,您是否嘗試過在配置中使用特定的MIME類型? – Jasen

+1

@Jasen是的,我有,不幸的是無濟於事。 –

回答

2

我試着在一個空的4.7 .NET Web項目中啓動,並且我得到了壓縮,至少在index.html上。我安裝了動態壓縮,添加了幾個Owin軟件包,下面的web.config等工具。使用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(爲我工作不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> 

啓動。CS(略)

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" }); 
       } 
      }; 
      ... 
      } 
    } 
} 

響應

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

我發現這三種資源是在任一ASP.Net WCF和Web API頁面配置IIS動態壓縮有用。我認爲它也適用於.Net Core,但我還沒有嘗試過。前兩個是有點老,但原則仍然適用:

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/

具體做法是:

  • 是的,你確實需要動態HTTP壓縮模塊安裝在IIS中,並啓用
  • 確保動態壓縮在IIS管理[你的服務器] /壓縮下檢查: Enable Dynamic Compression
  • 仔細檢查的是,在客戶端的請求報頭中的MIME類型是在配置編輯器特意加入system.webServer/httpCompression/dynamicTypes/下,並且該類型處理」 Enabled屬性設置爲True
  • 添加在web.config條目在上面的鏈接,對方的回答
0

最有可能這個缺什麼你的Windows服務器上(我假設你在服務器上的工作概述Os)是Web的安裝服務器IIS性能功能,其中有兩個可以安裝的子模塊:Static Content ConpressionDynamic Content Compression

要檢查自己是否安裝運行的服務器管理器,選擇Add Roles and Features,選擇您的實例,在屏幕Server Roles擴大樹節點Web Server (IIS)Web ServerPerformance並驗證是否複選框表明Static Content ConpressionDynamic Content Compression安裝,如果不檢查並繼續功能安裝。然後在IIS管理器和網站設置中重複靜態和動態壓縮配置的所有設置步驟。它現在應該工作。

+0

我的操作系統是Windows 10 Home,所以我不確定在哪裏可以找到服務器管理器? –

+0

確定它改變了一些問題,使我的上述答案無用。要檢查您是否安裝了IIS中所需的功能,請轉到控制面板 - >程序和功能 - >打開或關閉Windows功能 - >查找Internet信息服務節點並展開它 - >展開萬維網服務節點 - >展開性能功能節點 - 並驗證是否選中了動態和靜態內容壓縮的複選框 - >如果不檢查它們並繼續安裝。 –