10

ウェブサイトで G-ZIP を使用したいので、次のコードをググってみました。

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (!string.IsNullOrEmpty(acceptEncoding))
        {
            acceptEncoding = acceptEncoding.ToLower();
            var response = filterContext.HttpContext.Response;
            if (acceptEncoding.Contains("gzip"))
            {
                response.AppendHeader("Content-encoding", "gzip");
                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            }
            else if (acceptEncoding.Contains("deflate"))
            {
                response.AppendHeader("Content-encoding", "deflate");
                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            }
        }
    }
}

属性をコントローラーまたはアクションに設定すると、正常に機能します。

[Compress]
public class PostController : Controller

コードのすべての部分で手動でこれを行いたくないので、この属性を

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new CompressAttribute());
}

しかし、アプリケーションを実行すると、次のコード行で例外が発生しました。

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);

response.Filter が null です。

なぜこれが起こっているのか、これを解決する方法を知りたいです。ありがとう!

- アップデート:

コントローラーに子アクションが含まれていて、それが呼び出されている場合にのみ例外が発生することがわかりました。

4

1 に答える 1