Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC4 Bundling Cache Headers

Tags:

I want to change the cache headers sent from a bundle request. Currently it is varying by User-Agent but I don't want it to, is there a way to change the headers sent by a bundle request?

After a quick look in the System.Web.Optimization assembly I can see the headers get set in Bundle.SetHeaders which is a private static function so I don't think its possible although I would love to be proven wrong.

like image 784
eth0 Avatar asked Oct 25 '12 09:10

eth0


2 Answers

This isn't something that we currently expose today. We only expose the Cacheability property on the BundleResponse that a IBundleTransform could change. And yes we explicitly set the following things:

                HttpCachePolicyBase cachePolicy = context.HttpContext.Response.Cache;                 cachePolicy.SetCacheability(bundleResponse.Cacheability);                 cachePolicy.SetOmitVaryStar(true);                 cachePolicy.SetExpires(DateTime.Now.AddYears(1));                 cachePolicy.SetValidUntilExpires(true);                 cachePolicy.SetLastModified(DateTime.Now);                 cachePolicy.VaryByHeaders["User-Agent"] = true; 

We have a work item our backlog to open this up and make this more extensible/customizable in the future.

like image 67
Hao Kung Avatar answered Nov 23 '22 06:11

Hao Kung


There is a workaround around it as mentioned in janv8000's comment on this response. You need to add the following URL rewrite rule to your web server:

<system.webServer>     <rewrite>         <outboundRules>             <rule name="Cache Bundles" preCondition="IsBundles" patternSyntax="ExactMatch">                 <match serverVariable="RESPONSE_Vary" pattern="User-Agent" />                 <action type="Rewrite" value="Accept-Encoding" />             </rule>             <preConditions>                 <preCondition name="IsBundles" patternSyntax="Wildcard">                     <add input="{URL}" pattern="*/bundles/*" />                 </preCondition>             </preConditions>         </outboundRules>     </rewrite> </system.webServer> 

Obviously you need to pay attention to have all your bundles in your bundles folder or change the IsBundles precondition accordingly.

like image 41
aBertrand Avatar answered Nov 23 '22 07:11

aBertrand