升级.NET 6后IIS子应用无法处理请求返回307问题求助
问题根因
安装.NET 6 托管捆绑包时会全局升级IIS内置的ASP.NET Core模块(ANCM)到v6版本,该版本对进程外部署的子应用PathBase处理逻辑存在变更:默认不会自动将IIS中配置的子应用路径作为PathBase传递给后端.NET Core应用,导致应用无法识别路径前缀,路由匹配失败。
即便卸载.NET 6相关组件,升级后的ANCM默认不会自动回滚到旧版本,因此重新安装.NET 3.1也无法解决问题。
你遇到的日志表现完全符合该问题特征:请求完整URL携带/subapplication前缀,但静态文件中间件仅匹配/ping路径,说明应用拿到的PathBase为空、Path直接为/ping,找不到对应控制器路由就走到了后续中间件。
修复方案
方案1:修改子应用web.config配置(推荐)
在子应用的web.config文件中,找到aspNetCore节点,添加applyWebConfigPath="true"属性,强制ANCM传递正确的PathBase参数:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\你的应用名.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="OutOfProcess" applyWebConfigPath="true"> </aspNetCore> </system.webServer>
该方案无需修改应用代码,每个子应用单独配置后立即生效,无需重启IIS全局服务。
方案2:回滚ANCM版本
重新下载对应.NET Core 3.1版本的托管捆绑包安装程序,运行时选择「修复」选项,会将全局ANCM版本回滚到兼容.NET Core 3.1的旧版本,修复完成后执行iisreset命令重启IIS即可。
方案3:应用代码中显式配置PathBase
如果需要兼容多环境部署,可以在应用启动代码中显式指定子应用路径前缀:
// .NET Core 3.1 Startup.cs 示例 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 显式配置子应用路径前缀 app.UsePathBase("/subapplication"); // 后续其他中间件配置保持不变 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // ...其他中间件 }
内容的提问来源于stack exchange,提问作者rducom
相关产品推荐
相关产品推荐

