gpt4 book ai didi

ASP.NET MVC - 在 RegisterGlobalFilters() 中使用 ActionFilterAttribute 时 Response.Filter 为 null

转载 作者:行者123 更新时间:2023-12-02 04:08:54 25 4
gpt4 key购买 nike

我想在我的网站上使用 G-ZIP,我在 google 上搜索了以下代码:

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);
}
}
}
}

当我将属性设置为 Controller 或操作时,它工作正常。

[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 为空。

我想知道为什么会发生这种情况以及如何解决。谢谢!

- 更新:

我发现只有当 Controller 包含子操作并且正在调用它时才会发生异常。

最佳答案

我的解决方案是过滤所有子操作。

if (filterContext.IsChildAction) return;

在您的方法顶部使用此代码。

public class CompressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.IsChildAction) return;

...
}
}

关于ASP.NET MVC - 在 RegisterGlobalFilters() 中使用 ActionFilterAttribute 时 Response.Filter 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15067049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com