在IIS中配置ASP.NET WebForms迁移至ASP.NET Core(YARP代理)求助
解决方案
1. 调整YARP路由配置,适配子应用路径
当Core应用部署在/sub1/sub2/myapp这类子目录时,YARP需要正确处理请求路径的前缀,避免把子目录路径传递给后端WebForms站点。修改appsettings.json:
"ReverseProxy": { "Routes": { "fallbackRoute": { "ClusterId": "fallbackCluster", "Order": 1, "Match": { "Path": "{**catch-all}" }, "Transforms": [ { "PathRemovePrefix": "/sub1/sub2/myapp" }, // 移除子应用前缀,把原始路径传给后端 { "RequestHeaderOriginalHost": "true" } // 保留原始主机头(按需启用,看WebForms站点需求) ] } }, "Clusters": { "fallbackCluster": { "Destinations": { "fallbackApp": { "Address": "http://localhost:7000" // 不同Core应用对应不同WebForms站点,比如web application2要改成http://localhost:7001 } } } } }
2. 配置ASP.NET Core应用的基础路径
在Core应用的Program.cs里设置应用的基础路径,确保应用能正确识别子目录的请求:
var builder = WebApplication.CreateBuilder(args); // 添加YARP服务 builder.Services.AddReverseProxy() .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); // 设置对应IIS子应用的路径前缀 app.UsePathBase("/sub1/sub2/myapp"); app.UseRouting(); // 启用YARP代理 app.MapReverseProxy(); app.Run();
3. 调整IIS子应用的配置
- 每个Core子应用的应用程序池必须设置为
.NET Core模式(无托管代码) - 检查
web.config里的ASP.NET Core模块配置,确保节点正确:
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\YourCoreApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </location> </configuration>
inheritInChildApplications="false"必须加上,避免继承父站点配置导致冲突
4. 验证代理行为
部署后测试:
- 访问
https://example.com/sub1/sub2/myapp/home,应该被代理到http://localhost:7000/home(对应WebForms站点的路径) - 如果WebForms站点依赖原始主机头,确保YARP的
RequestHeaderOriginalHost转换已启用,或者按需调整RequestHeaderHost转换
常见问题排查
- 出现404:检查子应用路径前缀是否和
UsePathBase、PathRemovePrefix配置完全一致 - 后端收到错误路径:确认
PathRemovePrefix是否正确移除了子目录前缀 - 权限报错:确保Core应用的程序池对站点目录有读写权限(日志、临时文件等)
内容的提问来源于stack exchange,提问作者Carlos Luna
相关产品推荐
相关产品推荐

