Sim*_*ver 11 asp.net-mvc caching donut-caching
我试图让[ CompressFilter ]使用甜甜圈缓存并遇到问题.
会发生什么是整个页面被缓存而不仅仅是甜甜圈.CompressFilter我使用的来源如下.我将其从原始源更改为使用OnResultExecuted而不是OnActionExecuting()因为我需要访问结果的类型以避免缓存某些ActionResult子类.
看看实际的MVC v1源代码OutputCacheAttribute看起来它也在使用OnResultExecuted(),但我不认为这个事实直接导致冲突.
我不太清楚替换缓存是如何工作的,以了解其行为方式.我认为值得注意的是,这并不会导致任何类型的损坏显示.它只是表现得没有甜甜圈!
它看起来像我将不得不使用某种IIs'插件'来处理缓存,我真的想避免这样做,但它看起来我也需要甜甜圈缓存.
我现在更感兴趣的是知道它为什么会产生这种效果,但如果可能的话,解决方案也会很棒.
public class CompressFilter : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        // dont encode images!
        if (filterContext.Result is ImageResult)
        {
            return;
        }
        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding)) return;
        acceptEncoding = acceptEncoding.ToUpperInvariant();
        HttpResponseBase response = filterContext.HttpContext.Response;
        if (acceptEncoding.Contains("GZIP"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
        else if (acceptEncoding.Contains("DEFLATE"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
    }
}
这是CompressFilter类的糟糕实现.
请阅读:在C#中查找首选接受编码
我写了自己的,将遵循基于上述文章的AcceptEncoding ::
public class CompressFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpRequestBase request = filterContext.HttpContext.Request;
        string[] supported = new string[] { "gzip", "deflate" };
        IEnumerable<string> preferredOrder = new AcceptList(request.Headers["Accept-Encoding"], supported);
        string preferred = preferredOrder.FirstOrDefault();
        HttpResponseBase response = filterContext.HttpContext.Response;
        switch (preferred)
        {
            case "gzip":
                response.AppendHeader("Content-Encoding", "gzip");
                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                break;
            case "deflate":
                response.AppendHeader("Content-Encoding", "deflate");
                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                break;
            case "identity":
            default:
                break;
        }
    }
}
public class AcceptList : IEnumerable<string>
{
    Regex parser = new Regex(@"(?<name>[^;,\r\n]+)(?:;q=(?<value>[\d.]+))?", RegexOptions.Compiled);
    IEnumerable<string> encodings;
    public AcceptList(string acceptHeaderValue, IEnumerable<string> supportedEncodings)
    {
        List<KeyValuePair<string, float>> accepts = new List<KeyValuePair<string, float>>();
        if (!string.IsNullOrEmpty(acceptHeaderValue))
        {
            MatchCollection matches = parser.Matches(acceptHeaderValue);
            var values = from Match v in matches
                         where v.Success
                         select new
                         {
                             Name = v.Groups["name"].Value,
                             Value = v.Groups["value"].Value
                         };
            foreach (var value in values)
            {
                if (value.Name == "*")
                {
                    foreach (string encoding in supportedEncodings)
                    {
                        if (!accepts.Where(a => a.Key.ToUpperInvariant() == encoding.ToUpperInvariant()).Any())
                        {
                            accepts.Add(new KeyValuePair<string, float>(encoding, 1.0f));
                        }
                    }
                    continue;
                }
                float desired = 1.0f;
                if (!string.IsNullOrEmpty(value.Value))
                {
                    float.TryParse(value.Value, out desired);
                }
                if (desired == 0.0f)
                {
                    continue;
                }
                accepts.Add(new KeyValuePair<string, float>(value.Name, desired));
            }
        }
        this.encodings = from a in accepts
                         where supportedEncodings.Where(se => se.ToUpperInvariant() == a.Key.ToUpperInvariant()).Any() || a.Key.ToUpperInvariant() == "IDENTITY"
                         orderby a.Value descending
                         select a.Key;
    }
    IEnumerator<string> IEnumerable<string>.GetEnumerator()
    {
        return this.encodings.GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable)this.encodings).GetEnumerator();
    }
}
| 归档时间: | 
 | 
| 查看次数: | 3324 次 | 
| 最近记录: |