You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

IIS 8.5托管ASP.NET Core 2.0网站视图等文件更新不生效求助

解决ASP.NET Core 2.0在IIS 8.5中修改内容不生效的问题

我之前碰到过完全一样的糟心问题!针对Windows Server 2012 R2上IIS 8.5托管ASP.NET Core 2.0应用时,修改视图、DLL或CSS后更新不生效的情况,你可以按下面的步骤逐一排查:

  • 检查Kestrel进程是否被正确终止
    如果你的应用是进程外托管模式(ASP.NET Core 2.0默认模式),IIS只是反向代理,实际运行的是Kestrel服务器的dotnet.exe进程。有时候重启网站甚至IIS都没法杀掉这个进程,导致旧的代码和视图一直驻留内存。你可以打开任务管理器,找到所有dotnet.exe进程,手动结束后再重启网站,很多时候这就能解决问题。

  • 确认视图预编译设置
    打开你的项目.csproj文件,检查是否有<MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>这个配置。如果是true,视图会被预编译进DLL,修改.cshtml文件后必须重新发布才能生效。如果需要支持运行时修改视图,把这个值改成false,并且确保发布时把.cshtml文件同步到服务器的视图文件夹中。

  • 调整静态文件缓存策略
    IIS或者ASP.NET Core本身可能给CSS这类静态文件设置了强缓存。你可以:

    1. 在IIS管理器中打开网站的「HTTP响应头」,检查Cache-ControlExpires头的缓存时长是否过长;
    2. 在应用的Startup.cs里配置静态文件缓存,比如测试阶段可以临时禁用缓存:
    app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = ctx =>
        {
            ctx.Context.Response.Headers.Append("Cache-Control", "no-cache, no-store, must-revalidate");
            ctx.Context.Response.Headers.Append("Pragma", "no-cache");
            ctx.Context.Response.Headers.Append("Expires", "0");
        }
    });
    
  • 手动回收应用程序池
    有时候应用程序池的进程会被锁定,导致新文件无法加载。在IIS管理器中找到对应的应用程序池,右键选择「回收」,或者在「高级设置」里调整回收策略(比如设置内存占用过高时自动回收),确保应用能及时加载新内容。

  • 排查文件锁定问题
    如果DLL文件被其他进程占用,新的DLL就无法替换。你可以用Windows自带的「资源监视器」:打开后切换到「CPU」标签,在「关联的句柄」搜索框里输入你的DLL文件名,找到占用它的进程并结束,再重新部署文件。

  • 检查发布方式
    如果用Visual Studio发布,确保勾选了「删除目标文件夹中的现有文件」选项,避免旧文件残留;如果手动复制文件,要确保覆盖bin目录下所有DLL和视图文件夹里的.cshtml文件,不要遗漏任何文件。

  • 验证运行环境变量
    服务器上的ASPNETCORE_ENVIRONMENT环境变量如果是Production,ASP.NET Core会启用更严格的缓存。你可以在IIS的「配置编辑器」中,选择「系统.webServer/aspNetCore」,把environmentVariables里的ASPNETCORE_ENVIRONMENT临时改成Development,重启网站后测试修改是否生效(调试完成后记得改回Production)。

内容的提问来源于stack exchange,提问作者PantherUSA

火山引擎 最新活动