You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IIS托管的单网站中部署多个ASP.NET Core API服务

在IIS中托管多独立ASP.NET Core微服务+静态内容的配置方案

一、IIS核心配置步骤

  1. 创建主站点

    • 在IIS管理器中新建站点,将站点的物理路径指向存放静态内容(HTML/CSS/JS)的根目录,比如C:\inetpub\wwwroot\MainSite。
    • 配置站点的绑定(域名、端口等),确保直接访问站点根路径能正常返回静态首页。
  2. 为每个微服务创建独立应用程序

    • 右键主站点 → 添加应用程序:
      • 别名:填对应路径前缀,比如folder1(匹配请求路径/folder1/*)
      • 应用程序池:选择无托管代码的应用程序池(ASP.NET Core自身通过Kestrel托管,无需IIS托管运行时)
      • 物理路径:指向该微服务的发布文件夹(比如C:\inetpub\wwwroot\MainSite\folder1,需提前将微服务发布到这个目录)
    • 重复此步骤,为folder2、folder3分别创建对应应用程序,指向各自的微服务发布目录。
  3. 配置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的路径前缀匹配:

  1. 在微服务的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();
    
  2. 注意事项:
    • 每个微服务的UsePathBase参数要和IIS中对应的应用程序别名一致(比如folder2的微服务就用/folder2)。
    • MapGet("")、MapPost("")这类空路径映射,对应IIS路径前缀的根(比如/folder1);子路径直接写相对路径即可(比如/api/data对应/folder1/api/data)。

三、发布与验证

  1. 发布微服务:

    • 使用dotnet publish命令,将每个微服务的发布产物输出到IIS站点下对应的文件夹。
    • 确保发布文件夹中包含ASP.NET Core自动生成的web.config(用于IIS反向代理到Kestrel)。
  2. 验证测试:

    • 访问站点根路径:返回静态内容。
    • 访问http://yourdomain.com/folder1:返回WebApi1的根路径响应。
    • 访问http://yourdomain.com/folder2/api/hello:返回WebApi2的API响应。

内容的提问来源于stack exchange,提问作者AxD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:01:18