我有一个像这样的控制器动作
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Put)]
[InsertScript(Order = 1)]
[Compress(Order = 2)]
public ViewResult Service(Page page) { //omitted }
InsertScript属性应用了Response.Filter
response.Filter = new RegexResponseFilter(response.Filter, scriptInsertRegex, replacementString);
正则表达式响应过滤器基于博文here。注意我不是要删除空格我试图插入一个脚本标记,但这是无关紧要的。
RegexResponseFilter的write方法也是如此。其余部分与博客文章相同。
public override void Write(byte[] buffer, int offset, int count)
{
// capture the data and convert to string
var data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
// filter the string
var s = Encoding.Default.GetString(buffer);
s = regex.Replace(s, replacement);
// write the data to stream
var outdata = Encoding.Default.GetBytes(s);
response.Write(outdata, 0, outdata.GetLength(0));
}
这在隔离方面很有效。但是当我应用压缩属性(在互联网上任意数量的地方看到相当标准的属性)时,FF4发出了错误信息。
您尝试查看的页面无法显示,因为它使用的是无效或不受支持的压缩形式。
我闻到了一个红色的鲱鱼并删除了InsertScript属性,它可以正常工作。所以这两者在某种程度上是矛盾的。这是完整性的压缩属性。
public class CompressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//get request and response
var request = filterContext.HttpContext.Request;
var response = filterContext.HttpContext.Response;
//get encoding
var encoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrWhiteSpace(encoding))
return;
encoding = encoding.ToUpperInvariant();
if (encoding.Contains("DEFLATE") || encoding == "*")
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
else if (encoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
base.OnActionExecuting(filterContext);
}
}
这可能是显而易见的,但这看起来应该有效。插入应在压缩发生之前应用。
非常感谢
答案 0 :(得分:0)
尝试翻转包含顺序:
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Put)]
[Compress(Order = 1)]
[InsertScript(Order = 2)]
public ViewResult Service(Page page) { //omitted }
另一种可能性是组合这样的多个过滤器,然后使用单个动作过滤器属性:
response.Filter = new CompressStream(new InsertScript(response.Filter));
要使其正常工作,您需要像对CompressStream
一样编写自定义InsertScript
类,然后使用单个操作过滤器属性来组合这两个流。