web-dev-qa-db-ja.com

Web APIGzipが適用されていません

このS/O回答に基づいてgzip圧縮を有効にするweb.configエントリを追加しました IIS7 gzipを有効にします

次に、ASPXページの読み込み中にChrome開発者ウィンドウを確認し、応答にヘッダーが表示されました。

Cache-Control:private
Content-Encoding:gzip
Content-Length:3669
Content-Type:text/html; charset=utf-8
Date:Wed, 04 Mar 2015 00:46:05 GMT
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

つまり、それは「機能している」ということですよね?しかし、Web API呼び出しを行うときにそのヘッダーを探すとき、それは存在しません。

Cache-Control:no-cache
Content-Length:551
Content-Type:application/json; charset=utf-8
Date:Wed, 04 Mar 2015 00:53:05 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

私はあらゆる種類の異なる構成を試しました(上記のリンクされたS/Oの回答で推奨されているものから始めます)。最後に、必死の行動で、これに設定しました。これにより、すべてのリクエストを圧縮しようとすると思いました(*/*以外はすべてコメントアウトされています):

  <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
      <add mimeType="*/*" enabled="true"/>
      <!--<add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="application/json" enabled="true"/>-->
      <!--<add mimeType="*/*" enabled="false"/> -->
    </dynamicTypes>
    <staticTypes>
      <add mimeType="*/*" enabled="true"/>
      <!--<add mimeType="text/*" enabled="true"/>
      <add mimeType="message/*" enabled="true"/>
      <add mimeType="application/javascript" enabled="true"/>
      <add mimeType="application/json" enabled="true"/>-->
      <!-- add mimeType="*/*" enabled="false"/>-->
    </staticTypes>
  </httpCompression>
  <urlCompression doStaticCompression="true" doDynamicCompression="true"/>

GZIPがWebAPIメソッドに適用されない原因は何ですか?

更新

それ以来、 NuGet Web API圧縮パッケージ の両方を試し、IIS Express 8.0(Visual Studio)とローカルにインストールされたIIS 7.5の両方でapplicationHost.configを編集しました。すべて同じ結果が得られました。text/ *のような他のmimeタイプのリクエストは機能しますが、application/jsonはgzip圧縮を拒否します。

18
FirstDivision

WebAPIはファイアウォール、Webプロキシ、ウイルス対策スイートの背後にありますか? さらに高速なWebサイト:Web開発者向けのパフォーマンスのベストプラクティス(Steve Souders著) これはヘッダーを削除している可能性があります。

11
Paul

ASP.NET Web API圧縮(Ben Foster Blog) によると、次の2つのオプションがあります。

  1. applicationHost.configを変更して追加します

    httpCompression-> dynamicTypesセクションに移動します。

  2. Web APIパイプラインで委任ハンドラーを使用して、圧縮を処理します。
    例えば。 Fabrik.Common または Microsoft ASP.NET Web API圧縮サポート

5

上記の2つのソリューションと他の場所のその他のソリューションのおかげで、上記の投稿以降にいくつかのパッケージ/名前空間が変更されたため、Web API2.2でhttp圧縮を機能させる方法を段階的に説明することが有益であると考えました。

1)nugetパッケージマネージャーコンソールを使用して、以下をインストールします。

Install-Package Microsoft.AspNet.WebApi.MessageHandlers.Compression

2)WebApiConfig.cs内で、これらの使用法を追加します。

using System.Net.Http.Extensions.Compression.Core.Compressors;
using Microsoft.AspNet.WebApi.Extensions.Compression.Server;

3)WebApiConfig.cs内で、Register(HttpConfiguration config)の下部に追加します。

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

4)web.configを編集し、system.webServer内で追加します。

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="true" />
<httpCompression>
    <dynamicTypes>
        <clear />
        <add enabled="true" mimeType="text/*" />
        <add enabled="true" mimeType="message/*" />
        <add enabled="true" mimeType="application/x-javascript" />
        <add enabled="true" mimeType="application/javascript" />
        <add enabled="true" mimeType="application/json" />
        <add enabled="false" mimeType="*/*" />
        <add enabled="true" mimeType="application/atom+xml" />
    </dynamicTypes>
    <staticTypes>
        <clear />
        <add enabled="true" mimeType="text/*" />
        <add enabled="true" mimeType="message/*" />
        <add enabled="true" mimeType="application/javascript" />
        <add enabled="true" mimeType="application/atom+xml" />
        <add enabled="true" mimeType="application/xaml+xml" />
        <add enabled="true" mimeType="application/json" />
        <add enabled="false" mimeType="*/*" />
    </staticTypes>
</httpCompression>

ローカルWebサイトとAzureWebサイトの両方で初めて作業したので、うまくいけばうまくいきます。さらに、applicationHost.configをいじる必要はありません...

4
alv

@Peeticusは正しい方向に進んでいたと思います。

これが私がそれを機能させるためにしたことです:

「Install-PackageMicrosoft.AspNet.WebApi.MessageHandlers.Compression」を実行するか、GUIを介して追加した後、/ App_Start /WebApiConfig.csを更新する必要があります。

次の追加のusingステートメントが必要です。

using Microsoft.AspNet.WebApi.MessageHandlers.Compression.Compressors;
using Microsoft.AspNet.WebApi.MessageHandlers.Compression;

WebApiConfig.Registerメソッド内に以下を追加します。

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

次に、IISExpress applicationHost.configで、<httpCompression>の<dynamicTypes>要素と、デフォルトの<add mimeType = "/" enabled = "false" />の前にある次の要素を見つけます。

<add mimeType="application/json" enabled="true" />

また、applicationHost.configで<urlCompression />をに更新します

<urlCompression doDynamicCompression="true" />
3
Dane W

サーバー側ですべての宿題をしたと思いますが、問題はリクエストにあります。

サーバーが応答を圧縮できるようにするには、次のことが必要ですこのヘッダーを要求に含めます

Accept-Encoding: gzip, deflate

これを行わないと、サーバー側で何を行っても、応答が圧縮されることはありません。

Web APIクライアントを指定する必要はありませんが、クライアントAPIを使用してリクエストにヘッダーを追加する方法は常にあります。

3
JotaBe

あなたが見ている問題は、ドキュメントが述べているように https://github.com/azzlack/Microsoft.AspNet.WebApi.MessageHandlers.Compression 860バイト未満の応答は圧縮されておらず、あなたの例は「Content-Length:551」。さらにデータを送信すると、問題なく動作するはずです。

2
Cine

最初は。

Web API応答はmime typeであるため、IISはWEBAPI応答の圧縮を無視します

application/json; charset=utf-8

デフォルトIIS圧縮設定含まないこのMimeタイプなので、応答は圧縮されません。

したがって、このmimeタイプを<dynamicTypes>セクションに追加する必要があります

<add mimeType="application/json; charset=utf-8" enabled="true" />

(または、<add mimeType="*/*" enabled="true" />を実行したように、テストするだけです)

[〜#〜] but [〜#〜]

デフォルトでは<httpCompression>セクションは外部からの設定のためにIIS)によってロックされています!!

したがって、web.configで指定した設定はすべてignoredになります!

applicationHost.config<httpCompression>セクションでこれらの設定を指定しない限りOR <httpCompression>セクションを編集して、外部からの設定を許可します。

<section name="httpCompression" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
2

NuGetパッケージMicrosoft.AspNet.WebApi.MessageHandlers.Compressionの実装で、App_Start\WebApiConfig.csファイルに必要な行(以下)を追加しましたか?パッケージのホームサイトの指示に従って、同じメソッド内の他のすべてのメッセージハンドラーの後にある必要があることに注意してください。

GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

これは、ブログで使用したWebApiConfigファイルのRegisterメソッドのサンプルです。

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { echo = RouteParameter.Optional }
        );
        GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
    }

これは私が言及したブログ投稿です: 。Net Web API Compression

1
Peeticus