c# - 不允许过滤

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

我已经实现了一种操作方法来缩小 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 上调用这个方法并得到异常

最佳答案

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

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

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

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

关于c# - 不允许过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23708181/

相关文章:

Javascript 在部分渲染后不执行

css - 在 ASP.NET 中将 HTML 转换为 PDF 时保持 CSS 样式

c# - 将参数(字符串)传递给 GetAsync()?

asp.net-mvc - 在 MVC 中将 TextBoxFor 与 viewModel 结合使用时出现问题

C#算法为单元测试创​​建假的加拿大社会安全号码(SIN)

c# - 生成 docfx 后 PlantUml 不呈现图表

c# - 如何解决 C# 中的 System.OutOfMemoryException?

c# - 如何生成对方法参数的 `Expression` 引用

asp.net - 正则表达式来验证 url

asp.net - 如何序列化 LINQ-to-SQL 惰性列表