Перекомпиляция System.Web.Optimization для изменения заголовков кэша

Я хочу перекомпилировать System.Web.Optimization, чтобы изменить заголовки кеша в Bundle.cs (CDN не любит заголовок Vary), поскольку другого способа переопределить заголовки, похоже, нет. Я могу декомпилировать исходный код (через Resharper), внести изменения и перекомпилировать исходный код, но когда я добавляю ссылку на свой проект, все зависимые пакеты Nuget выдают ошибку. Аналогично приведенному ниже.

Тип System.Web.Optimization.IBundleBuilder определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35»

Я бы предпочел не компилировать все зависимости. Я также открыт для других способов переопределения заголовков кеша. HTTP-модули, IIS и т. д.


person qrider    schedule 22.07.2014    source источник


Ответы (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);
    }
person qrider    schedule 08.08.2014