Фильтрация не допускается

Я применил метод действий для минимизации 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 и получаю исключение

Ответ 1

Попробуйте добавить нуль-проверку перед применением фильтра:

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

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

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

Ответ 2

Кажется, что ваш код работает для меня, когда используется в новом приложении ASP.NET MVC 5, созданное в VS2013 (регулярные выражения, возможно, необходимо отрегулировать, но это небольшая деталь). Я загрузил полное решение здесь. Не могли бы вы попробовать?

Чтобы быть ясным, я заметил, что вы отметили вопрос с помощью asp.net-mvc-3 и asp.net-mvc-4, но у меня не было возможности протестировать эту версию ASP.NET MVC.

Ответ 3

Я столкнулся с той же проблемой, что и ваш собственный фильтр, и мой, и я не был удовлетворен ответом Rune (принятый ответ). Я смог определить проблему, когда я наткнулся на эту веб-страницу.

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.