2014-05-17 66 views
8

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

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这种方法和获取异常

+0

我不知道,但你试图重写'OnResultExecuted',而不是'OnActionExecuting',必须一切都是建立后应用过滤器。 –

+0

是的,我已经试过这个,但仍然得到相同的错误 – Anony

+0

@Inanikian我有一个父级以上这个子类 – Anony

回答

9

尝试加空检查之前,将过滤器:

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

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

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

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

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

+0

你的解决方案也有一些错误,但感谢您的帮助反正,至少你尝试过,但在这个问题上的其他用户甚至不知道MVC的ABC,我正在寻找一些.NET库的缩小的HTML。 – Anony

+0

不客气。是否有任何特定的原因,你没有使用已经内置到ASP.NET(在System.Web.Optimization)中的捆绑和缩小的东西? – Rune

+0

是的,但它只是用来缩小CSS和JAVA脚本而不是html。我对吗? – Anony

0

我也遇到同样的问题瓦特/既您的自定义过滤器和我的,我不在线北京与符文的答案(接受的答案)。当我偶然发现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 
     } 
    } 
}