新增ASP.NET Core Web API无法发布至Docker生产环境求助
问题
接手其他团队的ASP.NET Core Web API代码,现有接口在生产环境运行正常,修改后重新发布也没问题。但新增默认模板控制器后,本地运行正常,生产环境访问新增接口出现HTTP 404错误。已在launchsettings.json中设置ASPNETCORE_ENVIRONMENT为Production,以下是相关配置与代码:
launchsettings.json 关键配置
"environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Production" }
新增控制器代码
using Microsoft.AspNetCore.Mvc; namespace testweb.default { [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { // GET: api/<ValuesController> [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } // GET api/<ValuesController>/5 [HttpGet("{id}")] public string Get(int id) { return "value"; } // POST api/<ValuesController> [HttpPost] public void Post([FromBody] string value) { } // PUT api/<ValuesController>/5 [HttpPut("{id}")] public void Put(int id, [FromBody] string value) { } // DELETE api/<ValuesController>/5 [HttpDelete("{id}")] public void Delete(int id) { } } }
.gitlab-ci.yml 相关配置
variables: DOCKER_IMAGE_PRODUCTION : $CI_REGISTRY_IMAGE DOCKER_IMAGE_TEST : $CI_REGISTRY_IMAGE DOCKER_IMAGE_DEV : $CI_REGISTRY_IMAGE stages : - push_registry_dev - update_manifests_dev - push_registry_test - update_manifests_test - push_registry_uat - update_manifests_uat build_image_dev: stage: push_registry_dev image : mcr.microsoft.com/dotnet/sdk:8.0 services: - docker:24.0.6-dind variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" before_script: - cat /etc/os-release - curl -sSL https://get.docker.com/ | sh - echo -n $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY - export PATH="$PATH:/root/.dotnet/tools" - dotnet tool install --global dotnet-ef script: - cd ./TestProject.Web - dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer -p:ContainerImageName=test-backend - docker tag test-backend $DOCKER_IMAGE_TEST:$CI_COMMIT_SHORT_SHA-dev - docker push $DOCKER_IMAGE_TEST:$CI_COMMIT_SHORT_SHA-dev only: - develop - main - prod tags : - gitlab-org-docker update_manifest_dev: stage: update_manifests_dev variables: GIT_STRATEGY: none retry: 2 image: docker:24.0.6 services: - docker:24.0.6-dind script: - mkdir -p /root/.ssh - cat "${GIT_SSH}" > /root/.ssh/id_rsa - ssh-keyscan -H gitlab.com > /root/.ssh/known_hosts - chmod 400 /root/.ssh/id_rsa - apk add --no-cache git - export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa" - git config --global user.name "username" - git config --global user.email "email@gmail.com" - git clone --single-branch --branch main git@gitlab.com:company/k8s-manifests.git - cd k8s-manifests/test/dev/api - export REPO=$DOCKER_IMAGE_DEV:$CI_COMMIT_SHORT_SHA-dev - chmod -R 777 ${PWD} - docker run --rm -v ${PWD}:/workdir -e REPO=$REPO mikefarah/yq:4.12.2 e '.spec.template.spec.containers[0].image=env(REPO)' --inplace deployment.yml - git commit -am "New version updated ${CI_COMMIT_SHORT_SHA}-dev" && git push origin main tags: - gitlab-org-docker needs: ["build_image_dev"] only: refs: - develop - main - prod
排查与解决建议
1. 确认控制器是否被程序集扫描到
- 检查
Program.cs,确保存在builder.Services.AddControllers(),如果新增控制器在单独类库项目,需添加代码手动引入程序集:builder.Services.AddControllers().AddApplicationPart(typeof(ValuesController).Assembly); - 确认控制器所在项目已被设置为Web项目的依赖项,避免发布时遗漏编译输出。
2. 验证Docker镜像构建完整性
- 查看GitLab CI中
build_image_dev任务的日志,确认dotnet publish步骤无报错,新增控制器代码被正常编译。 - 手动拉取生产环境镜像,进入容器查看
/app目录下的程序集,确认包含新增控制器的编译文件。
3. 检查K8s部署是否更新到位
- 查看
k8s-manifests仓库的提交记录,确认deployment.yml中的镜像标签已更新为最新的$CI_COMMIT_SHORT_SHA-dev。 - 登录K8s集群执行
kubectl get pods -n <你的命名空间>,确认Pod使用的是最新镜像且已成功重启。若未重启,检查deployment.yml中的imagePullPolicy是否为Always,避免因IfNotPresent策略拉取旧镜像。
4. 核对生产环境路由配置
- 检查
Program.cs中的路由注册,确保存在app.MapControllers(),无全局路由前缀导致新增接口路由不匹配。 - 执行
kubectl logs <pod-name>查看应用日志,确认新增控制器的路由是否被正确注册。
5. 修正生产环境环境变量配置
launchsettings.json仅作用于本地开发,需在K8s的deployment.yml中添加环境变量:env: - name: ASPNETCORE_ENVIRONMENT value: "Production"- 检查Ingress配置,确认请求能正确转发到应用端口,无HTTPS/HTTP跳转导致的路由问题。
内容的提问来源于stack exchange,提问作者Noorul
相关产品推荐
相关产品推荐

