C# 对于index.html,不会调用StaticFileOptions.OnPrepareResponse

C# 对于index.html,不会调用StaticFileOptions.OnPrepareResponse,c#,node.js,angular,typescript,asp.net-core,C#,Node.js,Angular,Typescript,Asp.net Core,我目前正在尝试为带有.NET Core 2.2后端的Angular SPA禁用index.html缓存 通过为我的StaticFileOptions设置一个onpreparereresponse操作,我正在根据来执行此操作 但是,缓存控制头永远不会被发送。当我在OnPrepareResponse操作中设置断点时,除了index.html 我错过了什么?如何实际控制index.html文件的缓存 //我没有更改默认ASP.NET核心/角度模板中的任何其他内容 公共无效配置(IApplicatio

我目前正在尝试为带有.NET Core 2.2后端的Angular SPA禁用
index.html
缓存

通过为我的
StaticFileOptions
设置一个
onpreparereresponse
操作,我正在根据来执行此操作

但是,
缓存控制
头永远不会被发送。当我在OnPrepareResponse操作中设置断点时,除了
index.html

我错过了什么?如何实际控制
index.html
文件的缓存

//我没有更改默认ASP.NET核心/角度模板中的任何其他内容
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
// ...
var staticFileOptions=新的staticFileOptions
{
OnPrepareResponse=上下文=>
{
//以下文件的下一行命中的断点
//1:styles.61d14a95058dbe9da495.css
//2:runtime.a66f828dca56eeb90e02.js
//3:polyfills.7a0e6866a34e280f49e7.js
//4:main.d9791b5a6df420d81994.js
//5:favicon.ico
if(context.File.Name==“index.html”)
{
context.context.Response.Headers
添加(“缓存控制”,“无缓存,无存储,必须重新验证”);
Add(“Pragma”,“无缓存”);
context.context.Response.Headers.Add(“Expires”,“0”);
}
}
};
app.UseStaticFiles(staticFileOptions);
app.UseSpaStaticFiles(staticFileOptions);
// ...
}

您可以使用此代码查看它是否适合您

      app.UseSpaStaticFiles(new StaticFileOptions()
            {
                OnPrepareResponse = ctx =>
                {
                    var headers = ctx.Context.Response.GetTypedHeaders();
                    headers.CacheControl = new CacheControlHeaderValue
                    {
                        Public = true,
                        MaxAge = TimeSpan.FromDays(0)
                    };

                }
            });


     app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";
                spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions()
                {
                    OnPrepareResponse = ctx => {
                        var headers = ctx.Context.Response.GetTypedHeaders();
                        headers.CacheControl = new CacheControlHeaderValue
                        {
                            Public = true,
                            MaxAge = TimeSpan.FromDays(0)
                        };
                    }
                };

                if (env.IsDevelopment())
                {
                    spa.UseAngularCliServer(npmScript: "start");
                }
            });

我想出的另一个解决方案是这样的。我不确定我是否喜欢这个解决方案,但至少它是有效的

app.Use(异步(上下文,下一步)=>
{
context.Response.onStart(()=>
{
var requestPath=context.Request.Path.Value;
if(requestPath.EndsWith(“index.html”))
{
Add(“缓存控制”,“无缓存,无存储,必须重新验证”);
Add(“Pragma”,“无缓存”);
context.Response.Headers.Add(“Expires”,“0”);
}
返回Task.FromResult(0);
});
等待下一个();
});

感谢您的回复:)这将禁用所有文件的缓存,但我只想禁用index.html的缓存(因为js和css文件都有版本控制)。如果我能适应我的需要,我会和你的灵魂玩一玩。但我也找到了一个有效的解决方案(见我的答案)@Staeff:我相信@TonyNgo的这个答案是正确的。OP代码不起作用的原因是
index.html
app.UseSpa()
而不是
app.UseSpaStatic()
处理。只有其他
css
/
js
/。。。静态文件由
app.UseSpaStatic()
提供。我认为UseSpa下的部分是正确的,但是在
UseSpaStaticFiles
内的部分中,您应该删除
onpreparereresponse
处理程序。这样,您将只禁用默认文件路径的缓存,而启用其他静态文件的缓存。我正在windows WPF应用程序中使用WebView2和Kestrel server。上面最后两条评论是正确的
UseStaticFiles
什么都不做,
UseStaticFiles
为所有css/js服务
UseSpa
services
index.html
这种方法确实有效。但它不能解释为什么您的原始代码不能工作。在我看来,@Tony Ngo的回答回答了原因。