Перекомпиляция System.Web.Optimization для изменения заголовков кэша
Я хочу перекомпилировать System.Web.Optimization, чтобы изменить заголовки кэша в Bundle.cs (CDN не нравится заголовок Vary), так как, похоже, нет другого способа переопределить заголовки. Я могу декомпилировать исходный код (через Resharper), внести изменения и перекомпилировать исходный код, но когда я добавляю ссылку на мой проект, все зависимые пакеты Nuget выдают ошибку. Похоже на тот, что ниже.
Тип 'System.Web.Optimization.IBundleBuilder' определяется в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку "System.Web.Optimization, версия =1.1.0.0, Culture= нейтральный, PublicKeyToken=31bf3856ad364e35".
Я бы предпочел не собирать все зависимости. Я также открыт для других способов переопределения заголовков кэша. HTTPModules, IIS и т. Д.
1 ответ
Вместо того, чтобы перекомпилировать пользовательскую версию пакетов, я просто решил направить запросы к пакетам через другой HttpHandler. Быстрая замена в URL позволяет мне легко получить содержимое пакета и записать его с желаемыми заголовками кэша. Не самый желательный метод, но работает.
Отсутствие возможности устанавливать свои собственные заголовки в библиотеке - огромная проблема. Я надеюсь, что они исправят это в ближайшее время.
public void ProcessRequest(HttpContext context)
{
var request = context.Request;
var response = context.Response;
var cache = response.Cache;
var path = request.Url.LocalPath;
var bundlesPath = "~/" + path.Substring(path.IndexOf("mypath"));
bundlesPath = bundlesPath.Replace("mypath", "bundle");
Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlesPath);
var bundleContext = new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, bundlesPath);
var bundleResponse = bundle.GenerateBundleResponse(bundleContext);
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.UtcNow.AddYears(1));
cache.SetMaxAge(new TimeSpan(365, 0, 0, 0));
cache.SetValidUntilExpires(true);
// This handler is called whenever a file ending
// in .sample is requested. A file with that extension
// does not need to exist.
response.ContentType = bundleResponse.ContentType;
response.Write(bundleResponse.Content);
}