如何在单个Azure App Service用虚拟目录托管两个.NET Core项目
单Azure App Service托管.NET 5 MVC与API双项目可行方案
无需拆分两个独立App Service或购买额外App Service计划,单Azure App Service通过虚拟应用配置完全可以正常托管两个独立.NET Core项目,你之前遇到的报错均为配置步骤错误导致,和平台本身的能力限制无关。
之前操作的错误点说明
- 503.35 ANCM Multiple In-Process Applications in same Process:ANCM V2的InProcess托管模式要求单IIS工作进程内仅能运行一个.NET Core应用,你第一步仅创建了虚拟目录、未将其标记为独立应用,两个项目被默认放在同一个工作进程内加载,直接触发该报错。
- 502.5 ANCM Out-Of-Process Startup Failure:你发布后手动修改web.config的操作很容易漏配processPath、arguments参数,且子应用未配置路径基址,会导致路由、静态资源路径全部异常,被ANCM判定为启动失败。
- 503 Service unavailable:
AspNetCoreModule是ANCM V1版本,仅兼容.NET Core 2.2及更早版本,.NET 5完全不支持该模块,手动替换模块名必然导致服务不可用。
正确配置步骤
1. 门户端虚拟应用配置
进入App Service的Configuration > Path Mappings页面,删除之前创建的错误虚拟目录,按以下规则新建条目:
- 根应用(MVC项目):路径填
/,物理路径填site/wwwroot/mvc,勾选条目旁的Application复选框,将其标记为独立应用 - 子应用(API项目):路径填
/api,物理路径填site/wwwroot/api,同样勾选Application复选框标记为独立应用
两个应用标记为独立Application后,Azure App Service会自动做进程隔离,不会出现InProcess模式下的多应用加载冲突。
2. 项目侧配置修正
所有配置直接在项目代码中修改,不要发布后通过Kudu手动改web.config:
- 两个项目统一配置OutOfProcess托管模型,在各自
.csproj文件的<PropertyGroup>节点下添加如下配置:
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
- 部署到
/api路径的API项目,必须在启动配置中指定路径基址,否则路由、鉴权、静态资源路径会全部匹配错误。在API项目的Startup.Configure方法中,将如下代码放在所有中间件注册的最前面(位于app.UseRouting()、app.UseStaticFiles()等逻辑之前):
app.UsePathBase("/api");
- 两个项目共享静态文件、实体类的需求无需特殊处理:实体类直接通过项目引用共用即可;静态文件不要在两个项目目录中存多份,统一放在
site/wwwroot/shared目录下,两个项目的静态文件中间件都将文件提供者指向该共享目录即可。 - 原有发布配置无需调整:保持目标框架为
net5.0、部署模式为Framework Dependent、目标运行时为portable,App Service的x64 Windows运行时配置保持不变。
3. 发布与验证
- 分别将两个项目发布到之前配置的对应物理路径:MVC项目发布到
site/wwwroot/mvc,API项目发布到site/wwwroot/api,不要混合两个项目的发布文件。 - 发布时不要修改web.config生成规则,保持
modules="AspNetCoreModuleV2"的默认配置即可,不要替换为旧版ANCM模块。 - 如果启动后仍有异常,直接通过Kudu查看
/LogFiles/EventLog.xml和对应应用目录下的stdout日志定位问题,这类OutOfProcess启动错误通常是发布漏文件、appsettings配置缺失、路径权限问题导致,和双项目托管架构无关。
内容的提问来源于stack exchange,提问作者Fazil
相关产品推荐
相关产品推荐

