2017-10-13 11 views
14

私たちは、Visual Studio ASP .NETでのWeb APIからWebサイトのファイルを提供:ASP.NETのWeb APIとのHTTP圧縮を有効に

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と呼ばれていました)

  • Kestrel

だから、私はインスタンスでこれを行うには最初の好適な方法は、IIS動的圧縮モジュールであると思います。したがって、私はthis example次、テストとして、私のWeb.configファイルでこれを試してみました:

<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

アップデートはまだありません私の地元のIISとの紺碧のサーバーに取り組んでいました。

+1

すべてのタイプでワイルドカードの代わりに、設定で特定のMIMEタイプを試しましたか? – Jasen

+1

@ジャセンはい、残念ながら、私は役に立たない。 –

答えて

2

私はあなたのスタートアップを空の4.7 .NET Webプロジェクトで試してみましたが、少なくともindex.htmlでは圧縮を取得しました。動的圧縮をインストールし、いくつかのOwin Packages、web.configなどを追加して動作させました。 IISを使用して/

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

packages.configは、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のための動的圧縮を設定するのに有用であることがこれらの3つのリソースを発見しました。私はそれも.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/の下で構成エディタに追加されていることを再確認し、そして種類その
0

は、おそらくこれが何のWindows Server上で不足している(私はあなたがサーバー上で動作すると仮定上記のリンクや他の回答で説明したようハンドラ」Enabledプロパティは、web.configファイルのエントリを追加しますTrue

  • に設定されていますOs)はWebのインストールですサーバーIIS 2つのサブモジュール(Static Content ConpressionおよびDynamic Content Compression)がインストールされているパフォーマンスの機能。

    は、インストールされている場合は、実行サーバーマネージャをチェックAdd Roles and Featuresを選択し、あなたのインスタンスを選択し、それらをチェックして続行しない場合は、チェックボックスがStatic Content ConpressionDynamic Content Compressionがインストールされていることを示している場合、画面Server RolesPerformanceWeb Server、ツリーノードWeb Server (IIS)を拡張し、確認するために、機能のインストール。次に、IISマネージャーおよびWebサイトの設定で静的および動的圧縮構成のすべてのセットアップ手順を繰り返します。今はうまくいくはずです。

  • +0

    私のOSはWindows 10 Homeですので、サーバーマネージャーの場所はわかりませんか? –

    +0

    OK問題が少し変わり、私の上の答えは役に立たなくなります。 IISに必要な機能がインストールされていることを確認するには、コントロールパネル - >プログラムと機能 - > Windowsの機能を有効または無効にする - > Internet Information Servicesノードを見つけて展開 - World Wide Web Servicesノードを展開 - >ノードと、両方のチェックボックスがオンになっていることを確認します。チェックしていない場合は、インストールを続行します。 –

    関連する問題