如何在Windows Server 2019上用Windows服务托管多环境ASP.NET Core 6 API
同一域名多路径转发到多环境Windows服务API的实现方案
推荐方案:IIS ARR + URL Rewrite(最贴近IIS转发逻辑)
Windows Server 2019上可利用IIS的应用程序请求路由(ARR)和URL重写模块实现反向代理,完全匹配你需要的路径转发逻辑:
安装必要组件
- 打开服务器管理器,添加「Web服务器(IIS)」角色,勾选「应用程序请求路由(ARR)」和「URL重写」模块完成安装。
配置反向代理网站
- 在IIS管理器中创建一个空网站,绑定到目标域名的HTTPS端口,使用你已有的本地证书。
- 给该网站添加URL重写规则:
- 匹配模式:
^/(dev|test|prod)/(.*)(根据实际环境名称调整正则) - 操作类型选择「反向代理」
- 重写URL填写:
http://localhost:{对应环境端口}/{R:2}(比如dev环境服务监听5001端口,就填http://localhost:5001/{R:2}) - 进入IIS服务器节点的「ARR代理设置」,勾选「启用代理」确保功能生效。
- 匹配模式:
配置各环境API服务的Kestrel
- 每个环境的API服务(Windows服务)需监听不同的本地HTTP端口,在
appsettings.{env}.json中配置:"Kestrel": { "Endpoints": { "Http": { "Url": "http://localhost:5001" } } }
(HTTPS由IIS代理层处理,内部服务用HTTP即可,避免重复配置证书)
- 每个环境的API服务(Windows服务)需监听不同的本地HTTP端口,在
备选方案:YARP反向代理(轻量ASP.NET Core原生方案)
如果不想依赖IIS,可使用ASP.NET Core官方的YARP代理库搭建轻量转发服务,同样托管为Windows服务:
创建代理项目
- 新建ASP.NET Core空项目,安装NuGet包
Microsoft.AspNetCore.Yarp.ReverseProxy。
- 新建ASP.NET Core空项目,安装NuGet包
配置路由规则
- 在
appsettings.json中添加YARP的路由和集群配置,示例:"ReverseProxy": { "Routes": { "dev_route": { "ClusterId": "dev_cluster", "Match": { "Path": "/dev/{**catch-all}" }, "Transforms": [{ "PathRemovePrefix": "/dev" }] }, "test_route": { "ClusterId": "test_cluster", "Match": { "Path": "/test/{**catch-all}" }, "Transforms": [{ "PathRemovePrefix": "/test" }] } }, "Clusters": { "dev_cluster": { "Destinations": { "dev_node": { "Address": "http://localhost:5001" } } }, "test_cluster": { "Destinations": { "test_node": { "Address": "http://localhost:5002" } } } } }
- 在
启动代理服务
- 在
Program.cs中配置YARP:var builder = WebApplication.CreateBuilder(args); builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); var app = builder.Build(); app.MapReverseProxy(); app.Run("https://{server name}:443"); // 绑定到目标域名的HTTPS端口,使用已有证书 - 将该代理项目发布为Windows服务,和各环境API服务一同运行。
- 在
注意事项
- 所有Windows服务的监听端口必须唯一,避免端口冲突。
- 仅在反向代理层配置HTTPS证书,内部API服务用HTTP通信,简化证书管理。
- 测试时验证路径转发是否正确:比如访问
https://{server name}/dev/api/values应转发到http://localhost:5001/api/values。
内容的提问来源于stack exchange,提问作者borndeafin1ear
相关产品推荐
相关产品推荐

