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

DevOps部署流水线执行成功,但切换到Linux后应用无法运行

问题分析与修复方案

核心问题定位

你的流水线虽执行成功,但生成的部署包不符合Azure Linux App Service的运行要求,同时启动命令配置错误,导致应用未正确启动,因此显示默认页面并返回404。

具体修复步骤

1. 替换构建步骤为dotnet publish命令

原构建步骤用dotnet build加DeployOnBuild参数,是针对Windows IIS的部署逻辑,不适配Linux环境。改为dotnet publish生成符合要求的发布包:

- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    projects: '$(project)'
    arguments: '--configuration $(buildConfiguration) --runtime ubuntu.16.04-x64 --output $(Build.ArtifactStagingDirectory) /p:PublishSingleFile=true /p:SelfContained=false'
    publishWebProjects: false

说明:

  • --output指定统一输出目录,避免后续部署任务匹配到无关文件
  • /p:SelfContained=false对应你设置的RuntimeStack: DOTNETCORE|7.0,采用框架依赖模式;若需自包含可改为true
  • publishWebProjects: false精准控制目标项目,避免自动发布所有Web项目

2. 修正部署任务的包路径与启动命令

原部署任务的包路径可能匹配到无效zip,且StartupCommand为开发环境命令,不适合生产:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'se-tyr-aux-az-con'
    appType: 'webAppLinux'
    WebAppName: 'app-aux-recorder'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/**/*.zip'
    RuntimeStack: 'DOTNETCORE|7.0'
    StartupCommand: 'dotnet YourProjectName.dll' # 替换为实际项目DLL名称;若为单文件发布则用./YourProjectName

说明:

  • 包路径指向$(Build.ArtifactStagingDirectory),确保取到刚发布的正确包
  • 启动命令需指定具体执行文件,dotnet run仅用于开发调试,无法在生产环境正确加载应用

3. 切换构建代理至ubuntu-latest(推荐)

用Linux代理构建Linux目标包,避免Windows与Linux的文件格式、权限差异。切换后不会再出现"IIS实例找不到"的错误,因为新构建流程不再依赖IIS相关逻辑:

pool:
   vmImage: 'ubuntu-latest'

同时可移除NuGetToolInstaller和NuGetCommand步骤,dotnet publish会自动处理包还原。

额外排查方向

  • 查看Azure App Service日志流:在门户应用服务的「监控」→「日志流」中,查看应用启动日志,排查是否存在DLL加载失败、配置错误等信息
  • 检查发布包内容:下载部署后的zip包,确认根目录包含正确的DLL、appsettings.json等文件,而非嵌套在子文件夹中
  • 验证RuntimeStack匹配:确保RuntimeStack设置的.NET版本与项目目标框架一致,且和构建时的--runtime参数兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:10:45