gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:04:45 24 4
gpt4 key购买 nike

默认情况下,MVC 包在客户端缓存 1 年。是否可以手动设置它的客户端 header (针对 1 个特定捆绑包)?

我需要为我的一个捆绑包设置自定义过期 header 。我不能依赖“v=hash”查询字符串,因为这个包是用于外部网站的,每次我更改它时,他们都不会更改指向我的包的 url。

我尝试的是创建一个自定义 Bundle 类(继承 Bundle)并覆盖 GenerateBundleResponse() 方法。这样我可以控制服务器缓存,但自定义客户端缓存的唯一方法是设置 BundleResponse.Cacheability(公共(public)、私有(private)、nocache 等)。但我不能手动设置标题。我可以访问 BundleContext(它是 HttpContext),但是当我在该上下文上设置 header 时,它也会对所有其他请求产生影响。

最佳答案

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

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

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类(class):
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-mvc - MVC 捆绑客户端缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14374656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com