ASP.NET Core API部署至AWS Elastic Beanstalk Windows Server后代码变更未生效
针对你遇到的“构建部署成功但服务器未更新代码”的问题,从构建流程、部署环节、环境配置三个维度给出具体排查方向:
一、验证CodeBuild构建产物的正确性
修复buildspec.yml的缩进问题
你提供的buildspec.yml存在严重缩进错误(YAML对缩进敏感),这可能导致CodeBuild无法正确执行指定步骤。正确的格式应该是:version: 0.2 phases: install: runtime-versions: dotnet: 7.0 pre_build: commands: - dotnet restore .\project\foo.csproj build: commands: - dotnet build .\project\foo.csproj --configuration Release post_build: commands: - dotnet publish .\project\foo.csproj --configuration Release --output ./publish artifacts: files: - 'publish/**/*' base-directory: './'关键调整:
- 给所有phases下的子节点添加正确缩进
- 明确指定
--configuration Release,避免默认用Debug模式构建 - 将publish输出到单独的
./publish目录,artifacts仅收集该目录内容,避免混入源码文件
检查CodeBuild构建日志
进入CodeBuild控制台查看对应任务的完整日志,确认:dotnet publish步骤是否成功生成publish目录及其中的foo.dll、web.config等文件- artifacts打包是否正确包含了publish目录下的所有产物,无遗漏最新代码
二、验证CodeDeploy的文件部署结果
登录EC2实例检查部署目录
Windows环境下Elastic Beanstalk默认部署目录为C:\inetpub\wwwroot或C:\Program Files\Amazon\ElasticBeanstalk\applications\<你的应用名称>,手动检查:foo.dll、web.config等文件的修改时间是否与最新构建时间一致- 文件内容是否包含你推送的最新代码变更(比如查看dll版本号或web.config修改痕迹)
查看CodeDeploy本地日志
在EC2实例的C:\ProgramData\Amazon\CodeDeploy目录下,找到对应部署任务的日志文件,确认:- 文件复制过程是否有报错、跳过或权限不足的记录
- 是否成功覆盖了旧版本文件
三、检查Elastic Beanstalk的环境配置
确保应用池自动重启
Windows IIS环境下,文件更新后应用池可能不会自动重启,导致旧dll持续被占用。可以通过.ebextensions脚本解决:
在应用根目录创建.ebextensions/restart_apppool.config文件,内容如下:commands: 01_restart_apppool: command: 'C:\Windows\System32\inetsrv\appcmd recycle apppool /apppool.name:DefaultAppPool' ignoreErrors: false该脚本会在部署完成后自动重启默认应用池,确保加载最新文件
验证web.config路径配置
检查web.config中的<aspNetCore>节点:<aspNetCore processPath="dotnet" arguments=".\foo.dll" ... />确认部署目录下确实存在
foo.dll,若publish后文件存放在子目录,需调整arguments为对应相对路径(比如.\publish\foo.dll)优化健康检查路径
若健康检查指向静态页面,可能在应用未真正更新时返回成功。建议修改为你的API接口(比如/swagger或某个业务接口),确保健康状态能反映应用实际运行版本
四、修复项目依赖的版本兼容问题
你的foo.csproj中,Microsoft.AspNetCore.Server.Kestrel和Microsoft.AspNetCore.Server.IISIntegration使用2.2.0版本,与目标框架net7.0严重不兼容,可能导致新代码逻辑无法加载。将这两个包升级到与net7.0匹配的版本(比如7.0.5):
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="7.0.5" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="7.0.5" /> </ItemGroup>
内容的提问来源于stack exchange,提问作者Ygbh

