如何在IIS托管的单网站中部署多个ASP.NET Core API服务
在IIS中托管多独立ASP.NET Core微服务+静态内容的配置方案
一、IIS核心配置步骤
创建主站点
- 在IIS管理器中新建站点,将站点的物理路径指向存放静态内容(HTML/CSS/JS)的根目录,比如
C:\inetpub\wwwroot\MainSite。 - 配置站点的绑定(域名、端口等),确保直接访问站点根路径能正常返回静态首页。
- 在IIS管理器中新建站点,将站点的物理路径指向存放静态内容(HTML/CSS/JS)的根目录,比如
为每个微服务创建独立应用程序
- 右键主站点 → 添加应用程序:
- 别名:填对应路径前缀,比如
folder1(匹配请求路径/folder1/*) - 应用程序池:选择无托管代码的应用程序池(ASP.NET Core自身通过Kestrel托管,无需IIS托管运行时)
- 物理路径:指向该微服务的发布文件夹(比如
C:\inetpub\wwwroot\MainSite\folder1,需提前将微服务发布到这个目录)
- 别名:填对应路径前缀,比如
- 重复此步骤,为
folder2、folder3分别创建对应应用程序,指向各自的微服务发布目录。
- 右键主站点 → 添加应用程序:
配置URL重写规则(关键)
- 确保IIS已安装URL重写模块(未安装的话,通过服务器管理器的Web服务器角色添加)。
- 在主站点的
web.config中添加重写规则,保证静态内容优先,同时将对应路径的请求转发到微服务:<configuration> <system.webServer> <rewrite> <rules> <!-- 静态内容优先:请求的文件/目录存在则直接返回 --> <rule name="Static Content" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" /> </conditions> <action type="None" /> </rule> <!-- 将/folder1/*请求转发到folder1应用 --> <rule name="Forward to folder1" stopProcessing="true"> <match url="^folder1/(.*)" /> <action type="Rewrite" url="/folder1/{R:1}" /> </rule> <!-- 将/folder2/*请求转发到folder2应用 --> <rule name="Forward to folder2" stopProcessing="true"> <match url="^folder2/(.*)" /> <action type="Rewrite" url="/folder2/{R:1}" /> </rule> <!-- 未匹配的请求返回静态首页或404 --> <rule name="Default Static" stopProcessing="true"> <match url=".*" /> <action type="Rewrite" url="/index.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
二、ASP.NET Core微服务的路由配置
每个微服务需要配置路径基,确保路由与IIS的路径前缀匹配:
- 在微服务的
Program.cs中添加UsePathBase中间件:var builder = WebApplication.CreateBuilder(args); // 配置路径基,对应IIS应用程序的别名 builder.WebHost.UsePathBase("/folder1"); // 添加服务 builder.Services.AddControllers(); var app = builder.Build(); // 启用路径基 app.UsePathBase("/folder1"); // 配置路由 app.MapControllers(); // 映射/folder1路径 app.MapGet("", () => "WebApi1 根路径响应"); // 映射/folder1/api/hello路径 app.MapGet("/api/hello", () => new { Message = "Hello from WebApi1" }); app.Run(); - 注意事项:
- 每个微服务的
UsePathBase参数要和IIS中对应的应用程序别名一致(比如folder2的微服务就用/folder2)。 MapGet("")、MapPost("")这类空路径映射,对应IIS路径前缀的根(比如/folder1);子路径直接写相对路径即可(比如/api/data对应/folder1/api/data)。
- 每个微服务的
三、发布与验证
发布微服务:
- 使用
dotnet publish命令,将每个微服务的发布产物输出到IIS站点下对应的文件夹。 - 确保发布文件夹中包含ASP.NET Core自动生成的
web.config(用于IIS反向代理到Kestrel)。
- 使用
验证测试:
- 访问站点根路径:返回静态内容。
- 访问
http://yourdomain.com/folder1:返回WebApi1的根路径响应。 - 访问
http://yourdomain.com/folder2/api/hello:返回WebApi2的API响应。
内容的提问来源于stack exchange,提问作者AxD
相关产品推荐
相关产品推荐

