asp.net-mvc – MVC捆绑客户端缓存

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – MVC捆绑客户端缓存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
默认情况下,一个MVC包在客户端上缓存1年。是否可以手动设置它的客户端头(对于1特定的包)?

我需要的是为我的一个包设置自定义过期标头。我不能依赖“v = hash”查询字符串,因为这个包是一个外部网站,并且他们不会改变指向我的包的URL每次我更改它。

我试过的是创建一个自定义Bundle类(继承Bundle)和覆盖GenerateBundleResponse()方法。这样我可以控制服务器缓存,但定制客户端缓存的唯一方法是设置BundleResponse.Cacheability(public,private,nocache等)。但我不能手动设置标头。我可以访问BundleContext(和它的HttpContext),但是当我设置头文件上下文,它将影响所有其他请求以及。

解决方法

不幸的是没有办法。你可以在捆绑的内部实现中找到原因。在BundleHandler类中,ProcessRequest调用ProcessRequest,Bundle类的内部方法,它在HttpContext.Response.Write之前调用SetHeaders。因此,客户端缓存在响应写入之前设置为一年。

注意:BundleHandler是一个内部密封类:internal sealed class BundleHandler:IHttpHandler

在BundleHandler类中:

public void ProcessRequest(HttpContext context)
{
    if (context == null)
    {
        throw new ArgumentNullException("context");
    }
    context.Response.Clear();
    BundleContext context2 = new BundleContext(new HttpContextWrapper(context),BundleTable.Bundles,this.BundleVirtualPath);
    if (!Bundle.GetInstrumentationMode(context2.HttpContext) && !string.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"]))
    {
        context.Response.StatusCode = 304;
    }
    else
    {
        this.RequestBundle.ProcessRequest(context2);
    }
}

在Bundle类中:

internal void ProcessRequest(BundleContext context)
{
    context.EnableInstrumentation = GetInstrumentationMode(context.HttpContext);
    BundleResponse bundleResponse = this.GetBundleResponse(context);
    SetHeaders(bundleResponse,context);
    context.HttpContext.Response.Write(bundleResponse.Content);
}

private static void SetHeaders(BundleResponse bundle,BundleContext context)
{
    if (bundle.ContentType != null)
    {
        context.HttpContext.Response.ContentType = bundle.ContentType;
    }
    if (!context.EnableInstrumentation)
    {
        HttpCachePolicyBase cache = context.HttpContext.Response.Cache;
        cache.SetCacheability(bundle.Cacheability);
        cache.SetOmitVaryStar(true);
        cache.SetExpires(DateTime.Now.AddYears(1));
        cache.SetValidUntilExpires(true);
        cache.SetLastModified(DateTime.Now);
        cache.VaryByHeaders["User-Agent"] = true;
    }
}

猜你在找的asp.Net相关文章