从网址添加请求标头,以支持多租户

时间:2016-03-28 20:08:01

标签: web-services wcf

背景

我有一份无法修改的现有服务合约。该服务的实现是我支持并可以改变的代码。

目前,该服务支持单个租户,并托管此服务的多个实例,例如http://foo-tenant1.com/service.svchttp://foo-tenant2.com/service.svc

现在我想通过一项服务更改服务以支持多个租户。例如,服务托管在地址:http://foo.com/service.svc,并通过向地址添加租户ID来支持多个租户;

例如:

如果WCF可以某种方式支持通配符路由:

http://foo.com/tenant1/service.svchttp://foo.com/tenant2/service.svc等......

或者它是否可以某种方式支持查询字符串:

http://foo.com/service.svc?tenant1http://foo.com/service.svc?tenant2等......

或其他一些方式...

原因是调用此服务器的客户不会有任何租户概念。从客户的角度来看,每个租户只有一个网址。

问题

如何使用" catch all"来托管WCF服务?像这样的端点?或者我可以通过路由或URL重写来执行此操作吗?然后,我可以将租户ID放入请求标头,并修改服务代码以支持多租户。

然后我可以更改服务代码以从请求标头中读取并支持租户ID。

1 个答案:

答案 0 :(得分:0)

如果您无法访问服务代码或无法更改代码,那么您需要在框外思考一下。一种选择是在IIS中创建单独的应用程序,希望您的服务允许您更改web.config值,以便您可以配置服务以查看不同的数据库(如果这是支持它的话)。

但是如果web.config路由没有捕获所有变量,那么你可能不得不考虑做一个IHttpModule。尽可能早地在服务堆栈中注入这些内容可以让您选择使用URL执行操作,但是您仍然无法控制随后被调用的代码,除非您完全覆盖被调用的内容并且不会被调用。 t调用基本方法继续执行。

您还可以为404编写一个页面,让您可以控制支持代码,这样您就可以在此时动态执行某些操作。您只需要修改web.config文件,将404指向URL并执行它。虽然被警告,但这都是404。

最后,如果可以删除实现服务合同的代码,则可以将DLL放到实现合同的服务器上,并更新web.config文件以指向此DLL。如果您删除的DLL也删除了其他代码的重要部分,则可能无法执行此操作。

如果您无法访问代码,那么您将面临艰难时期,因为所有这些解决方案都是非常先进的概念。