Установить статические ресурсы как кэшируемые на базовом сайте Kentico Xperience 13 .NET

#c# #.net #.net-core #kentico

#c# #.net #.net-core #kentico

Вопрос:

Я пытаюсь использовать следующий код на сайте .NET Core под управлением Kentico Xperience 13.

 app.UseStaticFiles(new StaticFileOptions
{
    OnPrepareResponse = context =>
    {
        context.Context.Response.Headers[HeaderNames.CacheControl] = staticFileCacheHeaderValue;
    },
    HttpsCompression = HttpsCompressionMode.Compress
});
 

Это работает, поскольку мои статические файлы в wwwroot получают свой заголовок управления кэшем (и сжатие gzip).

Однако с этим кодом скрипты и стили конструктора страниц и конструктора форм больше не загружаются, выдавая значение 404. Например, в конструкторе форм предполагается загрузить этот файл: /Kentico/Scripts/builders/builder.css. Все, что начинается с /Kentico или /_content, внезапно 404s.

Это происходит независимо от того, что я передаю как StaticFileOptions — даже простое new StaticFileOptions() .

Я пробовал вызывать app.UseKentico() как до, так и после, и это не имеет значения. Если я вызываю app.UseStaticFiles() так же, как указано выше, ошибок Kentico нет, но к файлам wwwroot не применяется заголовок кэша (и они не сжимаются).

Я не очень хорошо знаком с .NET Core, поэтому я не уверен, что я что-то упускаю с этой стороны, или Kentico просто пока не работает хорошо. Любая помощь, конечно, очень ценится!

Ответ №1:

Необходимо установить контроль кэша в данном промежуточном программном обеспечении:

 app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions

{

    OnPrepareResponse = ctx => ctx.Context.Response.Headers.Append(HeaderNames.CacheControl, $"public, max-age={60 * 60 * 24 * 365}"),

    FileProvider = new PhysicalFileProvider(Path.Combine(Environment.ContentRootPath, @"Content")),

    RequestPath = new PathString("/Content")

});
 

Или, если я хочу установить его для app.UseStaticFiles() по умолчанию, необходимо настроить его в
ConfigureServicesmethod
в Startup.cs через services.Настроить :

 services.Configure<StaticFileOptions>(options =>
{
    options.OnPrepareResponse = ctx => ctx.Context.Response.Headers.Append(HeaderNames.CacheControl, $"public, max-age={60 * 60 * 24 * 365}");
});
 

Комментарии:

1. Спасибо за ответ. Метод служб, похоже, сработал! Первый метод, который вы упомянули, не сработал. Предположительно, идея заключается в том, что вы переопределяете определенную папку? Поскольку все, что я хочу кэшировать, находится в wwwroot, я заменил Environment. ContentRootPath со средой. WebRootPath и «Содержимое» с «шрифтами» (просто чтобы попробовать), но это ничего не кэширует. Не могли бы вы объяснить разницу между этими двумя подходами, пожалуйста?

2. Ааа, документы Kentico на самом деле говорят об этом здесь: docs.xperience.io/developing-websites /…

3. да, первая часть была связана с тем, когда вы хотите использовать пользовательскую папку для статических файлов. Я добавил его туда только для справки, но забыл упомянуть об этом. Извините за путаницу.

4. Это должно быть добавлено в документы @jurajo. Я хотел кэшировать свой каталог wwwroot / bundles на 365 дней и думал, что то, что я сделал, сработает, но это не привело к тому, что ни один из файлов <domain>/kentico/js … не был опубликован с использованием DevOps. Ваше первое решение было ключом к таргетингу на мой каталог wwwroot / bundles и включало app.UseStaticFiles(); его выше.