Я создаю веб-сайт, используя ядро .Net и angular 5. Я создал проект, используя последний шаблон angular ядра .Net (используя dotnet new angular с установленным ядром .Net 2.1).
Этот проект использует angular cli для сборки / упаковки и применяет хэш к связанным файлам js и css:
Однако после публикации моего сайта в службе приложений Azure я обнаружил, что когда я просматривал сайт, я видел старую версию до тех пор, пока я вручную не обновился с помощью F5 (Ctrl-F5 не требовалось). Похоже, это связано с тем, что, хотя файлы js / css не будут кэшироваться, страница index.html, содержащая ссылки на эти файлы, будет обслуживаться из кеша.
Когда я нажимаю F5, чтобы перезагрузить веб-сайт, с сайта запрашивается index.html (home ниже) (в данном случае 304, поскольку он не изменился, если он есть, он получит последнюю версию):
Однако, когда я изначально загружаю страницу (с помощью закладки или ввода адреса и т. д.), Страница обслуживается напрямую из кеша:
Это ожидаемое поведение? Почему загрузка страницы в первый раз отличается от нажатия клавиши F5? И можно / нужно предотвратить это кеширование?





Не изящное и не идеальное решение, но похоже, что оно сработало и может направить людей на правильный путь:
В Configure () в Startup.cs я добавил это
app.Use(async (c, next) =>
{
if (c.Request.Path == "/")
{
c.Response.Headers.Add("Cache-Control", "no-store,no-cache");
c.Response.Headers.Add("Pragma", "no-cache");
}
await next();
});
После добавления этого я не смог воспроизвести свою проблему.
@ZhenyiZhang Это отключит кеширование, добавив заголовки без кеширования. Проверка пути запроса гарантирует, что это применяется только тогда, когда путь запроса пуст (т. Е. Он будет применяться, когда запросом является www.example.com, но не www.example.com/api/foo).
Вот что я получил после того, как объединил кучу ответов. Моей целью было никогда не кешировать index.html. Пока я был там, и поскольку Angular прекрасно кэширует файлы js и css, я кэшировал все остальные ресурсы на год.
Просто убедитесь, что вы используете механизм очистки кеша для активов, таких как изображения, которыми вы управляете вне Angular.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// ...
app.UseStaticFiles();
if (env.IsDevelopment())
{
// no caching
app.UseSpaStaticFiles();
}
else
{
app.UseSpaStaticFiles(new StaticFileOptions
{
OnPrepareResponse = context =>
{
context.Context.Response.Headers.Add("Cache-Control", "max-age=31536000");
context.Context.Response.Headers.Add("Expires", "31536000");
}
});
}
// ...
app.UseSpa(spa =>
{
spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions
{
OnPrepareResponse = context =>
{
// never cache index.html
if (context.File.Name == "index.html")
{
context.Context.Response.Headers.Add("Cache-Control", "no-cache, no-store");
context.Context.Response.Headers.Add("Expires", "-1");
}
}
};
});
}
Другие ответы StackOverflow: Отключить кеширование в .Net Core | Кеш на год
Источник, на который вы ссылаетесь, использует модификацию app.UseStaticFiles(), вы используете модификацию app.UseSpaStaticFiles и указываете, что без каких-либо параметров кэширование не выполняется. Позже в UseSpa(spa => вы продолжите использовать другой подход, чтобы отключить кеширование для файлов html. Немного сбивает с толку, что будет работать, а что нет. При отладке обоих решений index.html не появляется и поэтому не добавляет никаких заголовков в этот файл. Я вижу, что в UseSpaStaticFiles все файлы изображений, svg и json проходят мимо, и я могу правильно управлять этими файлами ..
..но точка останова в DefaultPageStaticFileOptions никогда не достигается. По крайней мере, в среде разработки.
После публикации в тестовой среде я заметил разницу между dev и production. Я не использовал if-else для env.IsDevelopment(), и я сделал в обоих OnPrepareResponse одинаковое условие if-else для index.html. Один из параметров настроен правильно для применения no cache, no-store.
Будет ли кэшироваться каждый отдельный файл или только файл index.html? Я действительно не понял, кто c.Request.Path == "/" проверяет соответствие файлу index.html