如何在同一个 URL 下托管多个 .NET Core 应用程序?

Posted

技术标签:

【中文标题】如何在同一个 URL 下托管多个 .NET Core 应用程序?【英文标题】:How to host multiple .NET Core apps under the same URL? 【发布时间】:2017-02-20 15:33:06 【问题描述】:

我正在 ASP.NET Core 中构建一些网站(多个用户界面应用程序和一个 WebAPI 应用程序)。它们都使用 WebAPI 协同工作。就我的问题而言,我们将它们称为 App1、App2 和 App3。我在 IIS 中托管我的网站。

通常,在旧的 .NET Framework (4.5.1) 中,我会在 IIS 中拥有一个网站,其中包含多个 Web 应用程序来托管我的多个应用程序。像这样:

WebSite1 - 在端口 443 上运行

应用程序1

应用程序2

App3

如果网站 (WebSite1) 在端口 443 上运行(使用 SSL 证书),这意味着所有应用都可以通过一个域 url 访问,如下所示:

https://www.myapp.com/App1/

https://www.myapp.com/App2/

https://www.myapp.com/App3/

在 URL 末尾使用不同的应用名称来识别它们。

当托管新的 ASP.NET Core 应用程序时,我也在 IIS 中托管,并按照 ASP.NET Core 网站部署的文档,我将每个 .NET Core Web 应用程序托管在 IIS 内的不同站点中。

由于我的所有网站都有一个域名,例如https://www.example.com(我使用的是 SSL 证书),因此我必须为其他网站提供不同的端口。所以我最终得到了这样的结果:

WebSite1 - 在端口 443 上运行

WebSite2 - 在端口 444 上运行

WebSite3 - 在端口 445 上运行

所有这些应用程序都可以通过这些域名 URL 访问:

https://www.example.com/ 或 https://www.example.com:443/

https://www.example.com:444/

https://www.example.com:445/

如何将所有 ASP.NET Core 应用程序作为不同的“应用程序”托管在一个网站下,这意味着它们解析为相同的域名(https://www.example.com 和正斜杠应用程序名称标识我们想要的应用程序)?或者,我如何使用我现在配置的端口并将它们全部路由,以便 App1 是 example.com/ 的默认值,App 2 是 example.com/app2/,而 App 3 是 example.com/app3/?

我是否以完全错误的方式看待这个 .NET Core 部署?

【问题讨论】:

您是否尝试过 Windows 上的 WebListener 或反向代理(IIS (windwos) 或 nginx (linux))? 我没有@Tseng - 我以前从未真正使用过它,但我现在将运行一个快速的谷歌! 【参考方案1】:

您可以使用反向代理为同一域上的多个 ASP Net Core 应用程序提供服务。 使用 IIS 我不太确定,但您需要安装 URL Rewrite,然后按照 Microsoft 提供的 documentation 操作(this one 应该也会有所帮助)。 您还可以使用nginx 使用location 和proxy_pass,如下所示:

...
Some nginx Configuration 
location /App1 
        proxy_pass http://127.0.0.1:443;
    
location /App2 
        proxy_pass http://127.0.0.1:444;
    
location /App3 
        proxy_pass http://127.0.0.1:445;
    
Other configurations...

然后,每次您想将另一个 ASP Net 应用程序添加到您的域时,您都需要添加另一个位置,在不同的点运行应用程序并重新启动 nginx。

【讨论】:

我的 Ubuntu 服务器上有多个应用程序,我正在使用与您描述的 Nginx 相同的方法。但是我无法解决应用程序路由的问题:当我向 /App1 发出请求时,似乎该位置后面的应用程序正在处理此路径(例如127.0.0.1:443/App1)。但是由于应用程序中没有这样的路由,它会失败并出现错误 404。这个问题有解决方案吗? 如果你在 Azure 上,你也可以使用 API Gateway 之类的东西。【参考方案2】:

我在这里使用子应用程序的建议来完成这项工作:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2#sub-applications。

如果链接失效,这是重要的部分:

将 ASP.NET Core 应用程序托管为另一个 ASP.NET Core 下的子应用程序 应用:

1.为子应用建立应用池。将 .NET CLR 版本设置为无托管代码,因为核心公共语言运行时 (CoreCLR) 用于 .NET Core 被引导以在工作进程中托管应用程序,而不是 桌面 CLR (.NET CLR)。

2.在 IIS 管理器中添加根站点,并在根站点下的文件夹中添加子应用。

3.在IIS管理器中右击子应用文件夹,选择转换为应用程序。

4.在添加应用程序对话框中,使用应用程序池的选择按钮分配您为应用程序池创建的应用程序池 子应用程序。选择确定。

另外,我的主应用程序是旧版 Web 窗体,而我的子应用程序是令人兴奋的新 .NET Core 功能。

【讨论】:

【参考方案3】:

您无需为每个应用程序创建一个站点,您可以像以前一样将其托管为一个站点内的 Web 应用程序。您唯一需要做的就是为您的 .Net Core 应用程序选择非托管应用程序池,仅此而已。所以这有效: https://domain/app1 和 https://domain/app2 并且您只需要 1 个 Web 服务器证书

或者,您可以为每个应用创建站点,然后您需要为每个应用创建一个子域,例如 https://app1.domain 和 https://app2.domain 在这种情况下,所有子域都必须指向相同的 IP(如果您的服务器只有一个),并且您需要为每个站点\应用程序设置绑定到它的域。您应该将所有站点绑定到同一个端口(443 或 80)。

对于多站点配置中的 SSL,如果您有 IIS 7,您需要有一个通配符证书。在 IIS 8 及更高版本中,您可以使用服务器名称指示功能并为每个站点提供单独的证书,但是我建议您也使用通配符证书,因为 SNI 是新的,并且可能不被某些浏览器支持

在这两种情况下,您都需要从此处Microsoft's download center 设置 Windows Server 托管

【讨论】:

【参考方案4】:

假设您的主网络目录是:

mainweb\

确保在 App1 子文件夹中运行有效的 ASP.NET 应用程序:

mainweb\App1\

现在在 App1\ 文件夹中安装您的 dotnet core 2 或 3 应用程序以及所有依赖项等。

接下来,将这个 web.config 放到同一个文件夹中:

<?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=".\App1.exe" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="outofprocess" />
    </system.webServer>
  </location>
</configuration>

现在假设您还想在 mainweb 下运行另一个名为 App2\ 的 dotnet core web api:

    只需创建新文件夹 mainweb\App2\ 通过 IIS 或您的特殊网络托管应用程序在该文件夹中创建一个新的 asp.net 应用程序。 删除上面的web.config并将进程路径的一行更改为.\App2.exe

当 mainweb ASP.NET 应用程序启动时,它也会启动 dotnet 核心应用程序。 一切都好,它们在您的主网上运行:

https://mainweb.com/App1/WeatherForecast/ // WeatherForecast is controller name

https://mainweb.com/App2/<ApiControllerName>/

【讨论】:

我使用了你的解决方案但不起作用:***.com/q/69307858/6071729【参考方案5】:

对于 IIS,您可以使用 Application Request Routing (ARR) 结合 URL rewrite 模块将请求路由到每个 URL 端口之间的关联。 它用于构建类似 Nginx 的代理,并根据 URL 的每个模式指向适当的端口。 您可以在下面看到带有 ARR 的示例:

https://www.iis.net/learn/extensions/url-rewrite-module/reverse-proxy-with-url-rewrite-v2-and-application-request-routing

【讨论】:

【参考方案6】:

试试看:在 Web.config 文件中,每个应用程序都有不同的名称:&lt;add name="herenewappname" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /&gt;

【讨论】:

以上是关于如何在同一个 URL 下托管多个 .NET Core 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何托管 ASP.Net Web 应用程序

使用 MalformedPolicy 在 CDK 错误中创建托管策略

如何在托管对象上下文之外使用核心数据对象?

如何在 nginx 上托管的单个域下托管多个烧瓶应用程序?

如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?

创建 MVC的模板页,引用多个Css(期间,产生 HTTP 错误 500.23 - Internal Server Error   检测到在集成的托管管道模式下不适用的 ASP.NET 设置。)