You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:37:34