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

如何将含虚拟目录的应用发布至Azure App Service并保留指定结构

实现Azure App Service向IIS应用目录父目录发布内容的方案

不用重构整个应用也能搞定这个问题,我给你几个实用的、实际验证过的方案:

方案一:修改Visual Studio发布配置文件(最直接)

Visual Studio默认只会发布Web项目本身的内容,但我们可以通过自定义.pubxml配置文件,把父目录里的Config、Shared、Transform目录一起发布到Azure上wwwroot的父目录:

  1. 打开你的Web项目,找到Properties > PublishProfiles目录,打开现有的发布配置文件(比如Azure.pubxml),如果没有就新建一个发布配置。
  2. 在文件末尾添加以下XML代码,用来包含并复制父目录的内容:
<ItemGroup>
  <!-- 包含Config目录所有文件,发布到wwwroot的父目录 -->
  <Content Include="..\Config\**">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    <TargetPath>..\Config\%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
  </Content>
  <!-- 包含Shared目录所有文件 -->
  <Content Include="..\Shared\**">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    <TargetPath>..\Shared\%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
  </Content>
  <!-- 包含Transform目录所有文件 -->
  <Content Include="..\Transform\**">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    <TargetPath>..\Transform\%(RecursiveDir)%(Filename)%(Extension)</TargetPath>
  </Content>
</ItemGroup>

这里的TargetPath用..\是因为Visual Studio默认把Web项目发布到Azure的site\wwwroot目录,..\就指向了site目录(也就是wwwroot的父目录),刚好和你本地的app\目录结构对应。
3. 发布时选择这个自定义的配置文件,完成后Azure上的目录结构会变成:

site\
├─ Config\
├─ Shared\
├─ Transform\
└─ wwwroot\ (对应本地Web\目录)

方案二:用Azure DevOps Pipeline做CI/CD(适合自动化发布)

如果你们用DevOps来管理发布流程,可以通过Pipeline步骤来拼接完整的目录结构:

  1. 先把Web项目发布到构建 artifacts 的wwwroot目录
  2. 再把本地app\下的Config、Shared、Transform目录复制到artifacts的根目录
  3. 最后把整个artifacts目录发布到Azure App Service

参考YAML片段:

# 构建并发布Web项目到wwwroot
- task: VSBuild@1
  inputs:
    solution: '**/Web.csproj'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)/wwwroot"'

# 复制Config目录
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/app/Config'
    TargetFolder: '$(Build.ArtifactStagingDirectory)/Config'

# 复制Shared目录
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/app/Shared'
    TargetFolder: '$(Build.ArtifactStagingDirectory)/Shared'

# 复制Transform目录
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/app/Transform'
    TargetFolder: '$(Build.ArtifactStagingDirectory)/Transform'

# 发布到Azure App Service
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '你的Azure订阅名称'
    appType: 'webApp'
    WebAppName: '你的应用服务名称'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/**'

方案三:手动打包上传到Kudu(临时应急用)

如果只是临时发布,不想改配置,可以手动打包上传:

  1. 本地把app\目录下的所有内容(包括Web、Config、Shared、Transform)打包成ZIP文件
  2. 打开你的Azure App Service的Kudu控制台(访问https://<你的应用名>.scm.azurewebsites.net)
  3. 进入Debug console > PowerShell,导航到site\目录
  4. 上传刚才的ZIP包,然后用Expand-Archive命令解压到site\目录,这样wwwroot会自动作为应用根目录,其他目录就在它的父目录里了。

注意事项

  • 如果你的应用设置了WEBSITE_RUN_FROM_PACKAGE=1,发布后的文件是只读的,要是需要修改Config里的配置,建议把这个设置改成0,或者用Azure App Configuration来管理配置内容。
  • Web项目里引用父目录文件时,相对路径要正确,比如../Config/appsettings.config,在Azure上对应的就是D:\home\site\Config\appsettings.config,和本地的引用逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:48