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

时间:2017-02-20 15:33:06

标签: c# asp.net iis deployment asp.net-core

我正在asp.net核心构建一些网站(多个用户界面应用程序和一个web api应用程序)。他们都使用web api一起工作。出于我的问题的目的,我们将其称为App1,App2和App3。我在IIS中托管我的网站。

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

  • WebSite1 - 在端口443上运行

    • App1的

    • App2的

    • App3的

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

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

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

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

  • WebSite1 - 在端口443上运行

  • WebSite2 - 在端口444上运行

  • WebSite3 - 在端口445上运行

然后可以通过以下域名网址访问所有这些应用:

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

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

提前感谢任何指针!

6 个答案:

答案 0 :(得分:2)

您不需要为每个应用创建一个网站,您可以像以前一样托管它,作为一个网站内的网络应用程序。您唯一需要做的就是为您的.Net Core应用程序选择非托管应用程序池。这样可行: https://domain/app1https://domain/app2,您只需要1个Web服务器证书

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

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

在这两种情况下,您都需要从此处Microsoft's download center

设置Windows Server Hosting

答案 1 :(得分:1)

您可以使用反向代理在同一域上提供多个ASP Net Core应用程序 使用IIS我不太确定,但您需要安装URL Rewrite,然后按照Microsoft提供的documentationthis one也应该提供帮助)。
您还可以使用nginxlocation使用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。

答案 2 :(得分:1)

对于IIS,您可以使用与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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我是根据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新功能。

快乐的日子。

答案 5 :(得分:1)

假设您的主Web目录是:

mainweb\

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

mainweb\App1\

现在将您的dotnet core 2或3应用程序以及所有相关性等安装在App1 \文件夹中。

下一步,将此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核心Web api:

  1. 只需创建新文件夹mainweb \ App2 \
  2. 通过IIS或特殊的虚拟主机应用程序在该文件夹中创建一个新的asp.net应用程序。
  3. 在上方放置web.config并将进程路径的一行更改为。\ App2.exe

当mainweb ASP.NET应用程序启动时,它还将同时启动dotnet核心应用程序。 一切都很好,它们在您的主网下运行:

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

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