20

ここで詳しく説明されているように、MVC アクションに圧縮フィルターを使用しています。

http://msdn.microsoft.com/en-us/magazine/gg232768.aspx

Web API で同様のことを行うためにコードを再利用しようとしましたが、次の障害にぶつかりました。

public class CompressAPIAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        var preferredEncoding = GetPreferredEncoding(filterContext.Request);
        Stream compressedStream = null;
        // Compress the response accordingly
        var response = filterContext.Response;
        response.Headers.Add("Content-encoding", preferredEncoding.ToString());

        if (preferredEncoding == CompressionScheme.Gzip)
        {
            response.Content = new GZipStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK
        } 

        if (preferredEncoding == CompressionScheme.Deflate)
        {
            response.Content = new DeflateStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK
        }
        return;
    }

    enum CompressionScheme
    {
        Gzip = 0,
        Deflate = 1,
        Identity = 2
    }

    private CompressionScheme GetPreferredEncoding(HttpRequestMessage request)
    {
        var acceptableEncoding = request.Headers.AcceptEncoding;

        if (acceptableEncoding.Where(h => h.Value.Contains("gzip")).Count() > 0)
            return CompressionScheme.Gzip;

        if (acceptableEncoding.Where(h => h.Value.Contains("deflate")).Count() > 0)
            return CompressionScheme.Deflate;

        return CompressionScheme.Identity;
    }

圧縮されたストリームを応答のコンテンツに割り当てる方法はありますか?

これは、私が管理していない IIS 6.0 でホストされていることを指摘しておく必要があります。

4

2 に答える 2

60

アクションフィルターが実行される前にモデルバインディングステージが発生し、モデルバインディング中にフォーマッターがストリームを読み取って逆シリアル化する可​​能性があるため、アクションフィルターでこれを行うべきではないと思います。

IIS を使用している場合は、次のようにして圧縮を設定します (以下は、Scott Hanselman のブログ投稿からの抜粋です)。

  • IIS の「動的圧縮」機能を有効にしました。

  • IIS マネージャーに戻り、SITE ではなくSERVERのページに移動します。構成エディターをクリックします。 ここに画像の説明を入力

  • ドロップダウンから、system.webServer/httpCompression を選択します。 ここに画像の説明を入力

  • 次に、[動的型] をクリックします。リスト エディターが表示されたので、圧縮する型について考えます。デフォルトでは/は False ですが、これをオンにすることもできます。以下に示すように、もう少しこだわりを持って、application/atom+xml、application/json、application/atom+xml;charset=utf-8 を追加しました。application/atom+xml と application/atom+xml;charset=utf-8 が別のエントリであることはちょっとした問題です。ここに好きな mimeType を自由に追加してください。 ここに画像の説明を入力
  • それらを追加してダイアログを閉じたら、[IIS サービスの適用再起動] をクリックして、新しいモジュールをロードしてください。
  • ここでヘッダーを使用してリクエストを作成するAccept-Encodingと、期待どおりのレスポンスが表示されるはずです。

  • 編集(上記に加えて、両方の json 形式をカバーするために「application/json; charset=utf-8」を含めます)

于 2013-06-26T22:34:59.433 に答える