を返す WebAPI コントローラーがありHttpResponseMessage
、gzip 圧縮を追加したいと考えています。これがサーバー コードです:
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.IO.Compression;
[Route("SomeRoute")]
public HttpResponseMessage Post([FromBody] string value)
{
HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
return new SomeClass().SomeRequest(value);
}
これは、jQuery を使用した Ajax 呼び出しのクライアント コードです。
$.ajax({
url: "/SomeRoute",
type: "POST",
cache: "false",
data: SomeData,
beforeSend: function (jqXHR) { jqXHR.setRequestHeader('Accept-Encoding', 'gzip'); },
success: function(msg) { ... }
これを実行すると、サーバー コードはバグなしで返されますが、クライアント コードはバグになります。
(failed)
net::ERR_CONTENT_DECODING_FAILED
Fiddler で見ると、次のようになります。
Web サービスがクライアントが通常どおり処理する gzip 圧縮されたコンテンツを返すようにするには、何を変更する必要がありますか? HttpModule または IIS の設定を使用してこれを行うこともできることはわかっていますが、どちらのオプションもホスティングのシナリオに適合しません。
IIS 設定を探しているのではないことに注意してください。その設定 (ホスティング) にアクセスできないためです。
ベストアンサー1
次の NuGet パッケージを追加します。
Microsoft.AspNet.WebApi.Extensions.Compression.Server System.Net.Http.Extensions.Compression.Client
次に、次の 1 行のコードを追加しますApp_Start\WebApiConfig.cs
。
GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
それでうまくいくでしょう!
詳細:
**@JCisar からのコメントを受けて更新
ASP.Net Core のアップデート
NuGetパッケージは
Microsoft.AspNetCore.レスポンス圧縮