如何在同一服务器上托管Web应用程序和API,同时将它们分开?

时间:2014-06-12 16:14:03

标签: asp.net asp.net-mvc iis asp.net-web-api

假设我们有两个独立的应用程序,一个Web Api应用程序和一个用.NET 4.5编写的MVC应用程序。如果您要在主机标题“https://www.mymvcapp.com/”下的IIS中托管MVC应用程序,是否可以在主机标题“https://www.mymvcapp.com/api/”下的IIS中单独托管Web Api应用程序?

在IIS中运行2个应用程序的进程需要分开。我知道使用IIS托管,自托管和托管的单独方法。我想尽可能使用IIS。

另外,如果每个应用程序位于一个单独的服务器上,我将如何托管两个应用程序(API和Web应用程序),以便我可以从http://www.mymvcapp.com/api提供api?

1 个答案:

答案 0 :(得分:29)

至少有4种方法可以做你想做的事。前两种方法适用于如果您有1个Web服务器,并且这两个应用程序都是从运行IIS的那个Web服务器提供的。如果您在负载均衡器后面运行多个Web服务器,只要API和Web站点在同一服务器上运行,此方法也可以工作。

后两种方法使用所谓的“反向代理”,实质上是一种将流量从一个服务器(代理服务器)路由到多个内部服务器的方法,具体取决于您接收的流量类型。这适用于在一组服务器上运行Web服务器并在另一组服务器上运行API 。你可以使用你想要的任何反向代理软件,我提到nginx和HAProxy,因为我过去都使用过这两种软件。

运行IIS的单个Web服务器

在IIS中有两种方法:

如果您的物理文件夹结构如下:

c:\sites\mymvcapp
c:\sites\mymvcapp\api

您可以执行以下操作:

创建子应用程序

创建子应用程序将允许您从www.mymvcapp.com/api访问“API”网站,而无需进行任何路由更改。

要做到这一点:

  • 打开IIS管理器
  • 点击左侧“网站”文件夹树中的相应网站
  • 右键单击API文件夹
  • 点击“转换为应用程序”

缺点是所有子应用程序都继承了其父级的Web配置,如果你有相互矛盾的设置,你会看到一些运行时奇怪(如果它可以工作)。

创建目录Junction

第二种方法是这样做,以便应用程序保持其独立性;再一次,你不需要做任何路由。

假设有两个文件夹结构:

c:\sites\api
c:\sites\mvcapp

您可以在Windows中设置Junctions。从命令行*:

cd c:\sites
mklink /D /J mymvcapp c:\sites\mvcapp
cd mymvcapp
mklink /D /J api c:\sites\api

然后进入IIS管理器,并将它们转换为应用程序。这样,API将在\api\中可用,但实际上并未与父级共享其web.config设置。

多个服务器

如果您使用nginx或haproxy作为反向代理,您可以将其设置为根据需要将呼叫路由到每个应用。

nginx反向代理设置

在你的nginx.conf中(最佳做法是创建一个sites-enabled conf,它是sites-available的符号链接,你可以在部署时销毁该符号链接)执行以下操作:

location / {
    proxy_pass http://mymvcapp.com:80
}
location /api {
    proxy_pass http://mymvcapp.com:81
}

然后你设置正确的IIS设置让每个站点都在端口80(mymvcapp)和端口81(api)上侦听。

HAProxy的

acl acl_WEB hdr_beg(host) -i mymvcapp.com
acl acl_API path_beg -i /api

use_backend API if acl_API
use_backend WEB if acl_WEB

backend API
server web mymvcapp.com:81

backend WEB
server web mymvcapp.com:80

*我正在从内存中发出Junction命令;几个月前我这样做了,但最近没有,所以如果命令存在问题,请告诉我

NB :配置文件不是完整的配置文件 - 仅显示反向代理所需的设置。根据您的环境,您可能需要设置其他设置。