如何最好地将Web服务与公共可用的域名解耦?

我试图devise一个系统,允许多个公共端点通过一个Web服务。 Web服务必须能够确定哪个端点是请求的预期目标。 以下是一些可能适合该法案的示例configuration:

示例代理配置

在这个系统中,“反向代理”(缺less更好的术语)在传入的请求到达Web服务之前添加一个HTTP头。 否则,代理对请求和响应是完全透明的。

我们是使用IIS7 / WCF的Windows商店。

其目标是1)仅维护一个Web服务,而不是每个域的一个; 2)将域/网站pipe理与Web服务中的业务逻辑分离。 也就是说,如果我们知道上下文将始终用HTTP头中的一个键指定,那么我们不必担心域的更改或Request.Headers["HOST"]的具体内容。

我的问题是:这是一个合理的方法? 如果是这样,那里有一个应用程序可以完成“反向代理”的工作吗? (Squid?IIS本身?)

感谢您的帮助!

这听起来好像你试图做的是有一个单独的应用程序,完全分开的东西。 在某些时候,代码库和function将会重叠,但是我不太了解你的应用程序来帮助你。 我有2个可能的解决scheme给你:

  1. 我会尝试从您的控制器和模型分开视图相关的代码,如果你要去的MVC方向。 这会给你一个更清晰的业务逻辑分离。 一种可能的方法是将您的视图放到2个独立的目录中,但是包含来自共享第三个目录的代码。 这给你一个共享库,处理后端逻辑,同时干净地分离表示逻辑。

  2. 我不会害怕HTTP主机头。 这是HTTP / 1.1所需要的,所有现代浏览器都使用它。 哎呀,虚拟主机是完全依赖于它,你会很难find一个IIS或Apachepipe理员谁会告诉你不要在生产上使用虚拟主机。 当然,如果你在应用程序端进行头部检查,是否会遇到一些非常糟糕的if / case语句。 反向代理设置唯一的作用是寻找一个主机,并添加另一个头,除了主机。 所以你真的只是用反向代理为你的架构添加更多的头和复杂性。

首先,您的HTTP主机字段应该由您的反向代理保留,因为它通过请求。 如果不是,那么你的代理是错误的(和奇怪!)configuration。

其次,通过传递额外的报头和识别stream量是识别负载均衡器处理的stream量的标准和可接受的方式。 例如,负载平衡器通常被configuration为通知Web服务器stream量正在通过SSL传入(因为SSL无法在该级别进行代理)。

最后,我认为你可能会让你的问题过于复杂。 实际上,与其背后的内容相比,域名的变化频率如何?! 这实际上并不是networking的工作原理……您的应用程序基于HTTP主机头中的域名提供内容没有任何问题,这是非常普遍的做法。

要做到这一点的一种方法是让一小群云负载均衡器针对您的Web服务。 Rackspace提供了LBaas,可能还有其他一些function。

http://www.rackspace.com/cloud/cloud_hosting_products/loadbalancers/

充分披露:我为Rackspace工作,但不在销售。