Очистка кеша index.html на веб-сайте .Net Core Angular 5

Я создаю веб-сайт, используя ядро ​​.Net и angular 5. Я создал проект, используя последний шаблон angular ядра .Net (используя dotnet new angular с установленным ядром .Net 2.1).

Этот проект использует angular cli для сборки / упаковки и применяет хэш к связанным файлам js и css:

Очистка кеша index.html на веб-сайте .Net Core Angular 5

Однако после публикации моего сайта в службе приложений Azure я обнаружил, что когда я просматривал сайт, я видел старую версию до тех пор, пока я вручную не обновился с помощью F5 (Ctrl-F5 не требовалось). Похоже, это связано с тем, что, хотя файлы js / css не будут кэшироваться, страница index.html, содержащая ссылки на эти файлы, будет обслуживаться из кеша.

Когда я нажимаю F5, чтобы перезагрузить веб-сайт, с сайта запрашивается index.html (home ниже) (в данном случае 304, поскольку он не изменился, если он есть, он получит последнюю версию):

Очистка кеша index.html на веб-сайте .Net Core Angular 5

Однако, когда я изначально загружаю страницу (с помощью закладки или ввода адреса и т. д.), Страница обслуживается напрямую из кеша:

Очистка кеша index.html на веб-сайте .Net Core Angular 5

Это ожидаемое поведение? Почему загрузка страницы в первый раз отличается от нажатия клавиши F5? И можно / нужно предотвратить это кеширование?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
8
0
6 039
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не изящное и не идеальное решение, но похоже, что оно сработало и может направить людей на правильный путь:

В 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();
});

После добавления этого я не смог воспроизвести свою проблему.

Будет ли кэшироваться каждый отдельный файл или только файл index.html? Я действительно не понял, кто c.Request.Path == "/" проверяет соответствие файлу index.html

Zhenyi Zhang 06.07.2020 18:14

@ZhenyiZhang Это отключит кеширование, добавив заголовки без кеширования. Проверка пути запроса гарантирует, что это применяется только тогда, когда путь запроса пуст (т. Е. Он будет применяться, когда запросом является www.example.com, но не www.example.com/api/foo).

QTom 07.07.2020 12:29

Вот что я получил после того, как объединил кучу ответов. Моей целью было никогда не кешировать 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 проходят мимо, и я могу правильно управлять этими файлами ..

CularBytes 20.08.2019 18:05

..но точка останова в DefaultPageStaticFileOptions никогда не достигается. По крайней мере, в среде разработки.

CularBytes 20.08.2019 18:10

После публикации в тестовой среде я заметил разницу между dev и production. Я не использовал if-else для env.IsDevelopment(), и я сделал в обоих OnPrepareResponse одинаковое условие if-else для index.html. Один из параметров настроен правильно для применения no cache, no-store.

CularBytes 21.08.2019 09:13

Другие вопросы по теме