CSHTML视图在应用程序重新启动之前不会更新。

3
我正在使用BrowserLink编辑CSS样式,它的效果非常好。不幸的是,如果我在.cshtml文件中更改了内容,保存后我的浏览器会自动刷新,但更改并不可见。
如果我关闭应用程序并重新打开,更改就可以看到了。 似乎我的应用程序在某个地方以某种方式缓存视图,并且不会重新加载我对文件所做的更改。
这真的不是浏览器缓存问题。应用程序确实发送未更改的HTML结果。
我该如何在开发中禁用此类缓存功能?
我正在使用最新的ASP NET Core MVC库。
编辑: 如果我在_layout中进行任何更改,则网站会更新而没有任何问题。
编辑2:启动功能
        public void ConfigureServices(IServiceCollection services)
    {
        services.AddWebSocketManager();

        var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        var path = System.AppDomain.CurrentDomain.BaseDirectory;

        var machineName = Environment.MachineName;
        var confBuilder = new ConfigurationBuilder();
        IConfigurationBuilder conf = confBuilder.SetBasePath(path);

        if (env == "Development")
        {
            conf = conf.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true);
            conf = conf.AddJsonFile($"appsettings.Development.json", optional: true, reloadOnChange: true);
            conf = conf.AddJsonFile($"appsettings.{machineName}.json", optional: true, reloadOnChange: true);
            conf = conf.AddJsonFile($"appsettings.External.json", optional: true, reloadOnChange: true);
        }
        else
        {
            conf = conf.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true);
            conf = conf.AddJsonFile($"appsettings.Production.json", optional: true, reloadOnChange: true);
            conf = conf.AddJsonFile($"appsettings.External.json", optional: true, reloadOnChange: true);
        }
        Configuration = conf.Build();
        services.AddSingleton(provider => Configuration);

        CoreStarter.OnServiceConfiguration?.Invoke(Configuration, services);

        var settings = new JsonSerializerSettings();
        settings.ContractResolver = new SignalRContractResolver();
        var serializer = JsonSerializer.Create(settings);
        services.Add(new ServiceDescriptor(typeof(JsonSerializer),provider => serializer,ServiceLifetime.Transient));

        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.TryAddSingleton<IContextService, ContextService>();
        services.TryAddSingleton<ICryptoService, CryptoService>();
        services.TryAddSingleton<IAuthorizationHandler, AuthenticationHandler>();
        services.TryAddSingleton<IHttpService, RestApiService>();

        if (services.Any(x => x.ServiceType == typeof(IIdentityService)))
        {
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
            {
                options.Events.OnRedirectToLogin = (context) =>
                {
                    context.Response.StatusCode = 401;
                    return Task.CompletedTask;
                };
                options.Events.OnRedirectToAccessDenied = (context) =>
                {
                    context.Response.StatusCode = 401;
                    return Task.CompletedTask;
                };

                var sharedCookiePath = Configuration.GetJsonKey<string>("SharedCookiePath");
                if (!String.IsNullOrWhiteSpace(sharedCookiePath))
                {
                    options.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(sharedCookiePath));
                }
            });
        }


        services.AddCors();
        services.AddLogging(builder =>
        {
            builder.AddConsole().AddDebug();
        });
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info {Title = "CoreR API", Version = "v1"});
        });

        services.AddDistributedMemoryCache();
        services.AddSession();
        services.AddMemoryCache();
        services.AddSingleton<IAssemblyLocator, BaseAssemblyLocator>();
        services.AddSignalR(options =>
        {
            options.Hubs.EnableDetailedErrors = true;
        });

        var mvcBuilder = services.AddMvc(config =>
        {
            if (services.Any(x => x.ServiceType == typeof(IIdentityService)))
            {
                var policyBuilder = new AuthorizationPolicyBuilder();
                policyBuilder.RequireAuthenticatedUser();
                policyBuilder.AddRequirements(new AuthenticationRequirement());

                var policy = policyBuilder.Build();
                config.Filters.Add(new AuthorizeFilter(policy));
            }
        })
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        });

        var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();

        foreach (var assembly in assemblies)
        {
            mvcBuilder.AddApplicationPart(assembly);
        }

        ServiceProvider = services.BuildServiceProvider();
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider, IHostingEnvironment env)
    {
        var embeddedProvider = new EmbeddedFileProvider(Assembly.GetExecutingAssembly());
        var physicalProvider = env.ContentRootFileProvider;
        var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider);


        app.UseCors(o => o.AllowAnyOrigin().AllowCredentials().AllowAnyMethod().AllowAnyHeader());
        app.UseAuthentication();

        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();

        app.UseDefaultFiles(new DefaultFilesOptions()
        {
            FileProvider = compositeProvider,
            DefaultFileNames = new List<string>() { "default.html"},
        });
        app.UseStaticFiles(new StaticFileOptions {FileProvider = compositeProvider});
        app.UseSession();
        app.UseWebSockets();
        app.UseSignalR();
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "CoreR API");
        });

        app.UseMvc(routes =>
        {
            routes.MapRoute("Default", "api/{controller}/{action}/{id?}");
        });

        CoreStarter.OnConfiguration?.Invoke(Configuration, app, serviceProvider, env);
    }

默认情况下不会发生缓存。但是,如果您添加了类似响应缓存中间件之类的东西,那可能会成为一个问题。请展示您的 Startup.cs 文件。 - Chris Pratt
我添加了一些启动函数,它们有点大呵呵 - wh1sp3r
我唯一看到可能会有问题的是 UseDefaultFiles,它使用静态文件中间件来实际提供您的静态 HTML 文件。如果实际上是 default.html 没有刷新,那么它可能被浏览器缓存了。(如果浏览器直接使用缓存,它将看起来像服务器发送相同的响应)。 - Chris Pratt
所有的cshtml文件在应用程序重启之前都不会刷新。如果我更改layout.cshtml,它会被正确地刷新。 - wh1sp3r
1
这是同样的问题吗?https://dev59.com/LVQJ5IYBdhLWcg3wiWeb - Dai
1个回答

5
根据ASP.NET Core中的Razor文件编译,如果您只想在本地开发时启用运行时编译:
1.基于活动配置值有条件地引用Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation软件包:
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />

2. 更新项目的 Startup.cs 文件中的 ConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
    IMvcBuilder builder = services.AddRazorPages();

    if (env.IsDevelopment())
    {
        builder.AddRazorRuntimeCompilation();
    }
}

我不知道你可以有条件地添加 NuGet 包!不过自从 ASP.NET Core 3.1,可以通过编辑launchSettings.json文件而不是 Startup.cs 文件来完成: https://learn.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.1&tabs=visual-studio#conditionally-enable-runtime-compilation-in-an-existing-project - Doug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接