不允许过滤

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不允许过滤相关的知识,希望对你有一定的参考价值。

我已经实现了一个动作方法来缩小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*
s*", "
");
            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上调用这个方法并获得异常

答案

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

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

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

    response.Filter = new YourFilter(response.Filter);
}
另一答案

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

为了清楚起见,我注意到你用asp.net-mvc-3和asp.net-mvc-4标记了这个问题,但是我还没有机会测试那些版本的ASP.NET MVC。

另一答案

我遇到了同样的问题w /你的自定义过滤器和我的,我对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*
s*", "
");
                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
        }
    }
}

以上是关于不允许过滤的主要内容,如果未能解决你的问题,请参考以下文章

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

为什么我不能在此片段中生成唯一对象数组?

在Pandoc lua过滤器中连接字符串片段

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)

Scapy BPF 过滤器不工作

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段