【问题标题】:Filtering is not allowed不允许过滤
【发布时间】:2026-01-24 08:45:01
【问题描述】:

我已经实现了一种操作方法来缩小 HTML 它给出异常“不允许过滤”我已经搜索了互联网但找不到任何合适的解决方案。请指导我如何解决这个问题。我正在分享我的代码:

MinifyAttribute 类:

public class MinifyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var request = filterContext.HttpContext.Request;
        var response = filterContext.HttpContext.Response;

        response.Filter = new Minify(response.Filter, s =>
        {
            s = Regex.Replace(s, @"\s+", " ");
            s = Regex.Replace(s, @"\s*\n\s*", "\n");
            s = Regex.Replace(s, @"\s*\>\s*\<\s*", "><");
            s = Regex.Replace(s, @"<!--(.*?)-->", "");   //Remove comments

            var firstEndBracketPosition = s.IndexOf(">");
            if (firstEndBracketPosition >= 0)
            {
                s = s.Remove(firstEndBracketPosition, 1);
                s = s.Insert(firstEndBracketPosition, ">");
            }
            return s;
        }); // i'm getting exception here on this code block

    }
}

缩小类

public class Minify : Stream
    {
        private Stream _shrink;
        private Func<string, string> _filter;

        public Minify(Stream shrink, Func<string, string> filter)
        {
            _shrink = shrink;
            _filter = filter;
        }


        public override bool CanRead { get { return true; } }
        public override bool CanSeek { get { return true; } }
        public override bool CanWrite { get { return true; } }
        public override void Flush() { _shrink.Flush(); }
        public override long Length { get { return 0; } }
        public override long Position { get; set; }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return _shrink.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return _shrink.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            _shrink.SetLength(value);
        }
        public override void Close()
        {
            _shrink.Close();
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            // capture the data and convert to string 
            byte[] data = new byte[count];
            Buffer.BlockCopy(buffer, offset, data, 0, count);
            string s = Encoding.Default.GetString(buffer);

            // filter the string
            s = _filter(s);

            // write the data to stream 
            byte[] outdata = Encoding.Default.GetBytes(s);
            _shrink.Write(outdata, 0, outdata.GetLength(0));
        }


    }

我在 Controller 上调用此方法并得到异常

【问题讨论】:

  • 我不确定,但您是否尝试过覆盖OnResultExecuted 而不是OnActionExecuting,您必须在创建所有内容后应用您的过滤器。
  • 是的,我已经尝试过了,但仍然遇到同样的错误
  • @Inanikian 我在这个子类之上有一个父类
  • answer。它可以帮助您实现目标
  • @Inanikian 我以前试过这个方法,我还能用这个做些什么吗?

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

尝试在应用过滤器之前添加空检查:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var response = filterContext.HttpContext.Response;

    if (response.Filter == null) return; // <-----

    response.Filter = new YourFilter(response.Filter);
}

【讨论】:

    【解决方案2】:

    在 VS2013 中创建的全新 ASP.NET MVC 5 应用程序中使用您的代码似乎对我有用(可能需要调整正则表达式,但这是一个小细节)。我已经上传了完整的解决方案here。可以试试吗?

    需要说明的是,我注意到您已使用 asp.net-mvc-3 和 asp.net-mvc-4 标记了问题,但我没有机会在这些版本的 ASP.NET 上进行测试MVC。

    【讨论】:

    • 您的解决方案也有一些错误,但无论如何感谢您的帮助,至少您尝试过,但这个问题的其他用户甚至不知道 MVC 的 abc,我正在寻找一些 .NET 库进行缩小的html。
    • 不客气。您没有使用 ASP.NET(在 System.Web.Optimization 中)中已内置的捆绑和缩小功能是否有任何特殊原因?
    • 是的,但它仅用于缩小 CSS 和 JAVA 脚本而不是 html。我说的对吗?
    • 你是对的,抱歉,我的咖啡还没喝完 :-) 在网络服务器上打开 gzip 压缩怎么样?
    • 在此处查看评分最高(未接受)的答案:*.com/questions/702124/enable-iis7-gzip
    【解决方案3】:

    我遇到了与您的自定义过滤器和我的自定义过滤器相同的问题,并且我对 Rune 的答案(已接受的答案)不满意。当我偶然发现这个web page 时,我能够确定问题所在。

    public class MinfyAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;
    
            if (!filterContext.IsChildAction) //<--you need to make sure context is not a child action
            {
                response.Filter = new Minify(response.Filter, s =>
                {
                    s = Regex.Replace(s, @"\s+", " ");
                    s = Regex.Replace(s, @"\s*\n\s*", "\n");
                    s = Regex.Replace(s, @"\s*\>\s*\<\s*", "><");
                    s = Regex.Replace(s, @"<!--(.*?)-->", "");   //Remove comments
    
                    var firstEndBracketPosition = s.IndexOf(">");
                    if (firstEndBracketPosition >= 0)
                    {
                        s = s.Remove(firstEndBracketPosition, 1);
                        s = s.Insert(firstEndBracketPosition, ">");
                    }
                    return s;
                }); // i'm getting exception here on this code block
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      这可能无关,但我在这里搜索“不允许过滤”错误。我在安装 Visual Studio 2019 后发生了这种情况(当我遇到错误时,我正在 VS 2017 中调试我们的项目)。

      事实证明,我必须将项目从 .NET Framework 4.7.1 升级到 .NET Framework 4.8。

      之后,我不再收到错误消息。作为奖励,我们的项目随后也在 Visual Studio 2019 中运行,因此我们获得了升级 Visual Studio 的额外好处。

      【讨论】: