浏览器后退按钮不执行控制器方法

Browser back button does not execute the controller method

我在 asp.net 核心工作。我遇到一个问题,当我通过浏览器后退按钮返回上次访问的网页时,我的控制器操作方法没有被执行。

当我们按下后退按钮时,浏览器会从缓存中获取数据。所以,如果我们想执行控制器的动作方法,我们需要阻止浏览器缓存那个页面。

我在谷歌上搜索了很多关于这个的内容。通过这个,我在ASP.NET MVC中找到了很多基于缓存的解决方案。比如,禁用缓存。

我查看了这个网站,也试过了。 https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-2.2 .它不工作。

我们正在根据 cookie 执行一些操作。所以禁用缓存,也不应该清除这个。

ASP.NET Core 中是否还有其他方法可以在按下浏览器后退按钮时执行控制器操作方法?

提前致谢。

使用无缓存时要小心。对于Caching,它对性能起着重要作用。

如果你想用no-cache设置特定的控制器动作,你可以按照:

  1. Startup.cs

    中配置CacheProfiles
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Never",
            new CacheProfile()
            {
                Location = ResponseCacheLocation.None,
                NoStore = true
            });
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
  2. 使用

    [ResponseCache(CacheProfileName = "Never")]
    public IActionResult Index()
    {
        return View();
    }    
    

如果您坚持所有请求都没有缓存,请尝试使用中间件。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Use(async (context, next) =>
        {
            context.Response.OnStarting(() =>
            {
                if (context.Response.Headers.ContainsKey("Cache-Control"))
                {
                    context.Response.Headers["Cache-Control"] = "no-cache,no-store";
                }
                else
                {
                    context.Response.Headers.Add("Cache-Control", "no-cache,no-store");
                }
                if (context.Response.Headers.ContainsKey("Pragma"))
                {
                    context.Response.Headers["Pragma"] = "no-cache";
                }
                else
                {
                    context.Response.Headers.Add("Pragma", "no-cache");
                }
                return Task.FromResult(0);
            });
            await next.Invoke();
        });
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }