We deploy our dev version on a regular basis and realized we have caching issues on a regular basis.
The code in the index.html wants to load an old main.'someOldIdentifier'.bundle.js
Telling your browser to do a fresh reload solves the problem but seems like a workaround because we would have to this problem on every update.
Do you know a way how to circumvent that problem?
Maybe adding some http-response-headers like cache-control to the index.html?
Shouldn't that be something to default to anyway?
While creating a new angular project in Visual Studio the provided Startup.cs includes
That could probably solve this problem too.
I don't think UseSpaStaticFiles would add any caching headers considering its implementation. We do not add any HTTP headers on purpose as this is what Microsoft's default templates are doing by default. There isn't any default that is generic enough to serve all applications. You can add custom HTTP headers from IIS.
How would that be done with ASP.NET Core? We do not use an IIS server.
How do you deploy your applications then?
We deploy through docker, that's our dockerfile:
FROM node:8.15 as ngbuild
COPY client/ ./
RUN npm ci
RUN ./node_modules/.bin/ng build --output-path /app --prod
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS netbase
FROM microsoft/dotnet:2.2-sdk AS netbuild
COPY server server/
RUN dotnet build project.csproj -c Release -o /app
RUN dotnet publish project.csproj -c Release -o /app
FROM netbase AS final
COPY --from=netbuild /app .
COPY --from=ngbuild /app wwwroot/
# trailing slash is important! ("http://host.docker.local/")
CMD if [ -z "$WEBSERVER" ]; then echo "Need to set WEBSERVER environment variable (with trailing slash)"; exit 1; fi && \
sed "s#__WEBSERVER__#$WEBSERVER#g" -i /app/wwwroot/main.*.bundle.js && \
#ENTRYPOINT ["dotnet", "server.dll"]
Is that docker behind a reverse proxy (nginx, Apache etc)? You may have to dig into the ASP.NET Core documentation for static file caching options. I found this but haven't tested it.
We are using nginx as a reverse proxy in all Radzen demo applications. This allows us a lot of control without adding extra code.
No proxy, but your hint to the documentation helped.
After creating a Startup.Custom.cs it was possible to add just the index.html which should never be cached.
public partial class Startup
partial void OnConfigureServices(IServiceCollection services)
opts.OnPrepareResponse = context =>
if (context.File.Name == "index.html")
context.Context.Response.GetTypedHeaders().CacheControl = new CacheControlHeaderValue
Private = true,
NoStore = true,
MaxAge = TimeSpan.Zero,
NoCache = true,
MustRevalidate = true