【问题标题】:Add a request header from the url, to support multi-tenancy从 url 添加请求头,以支持多租户
【发布时间】:2016-03-28 20:08:00
【问题描述】:

背景

我有一个无法修改的现有服务合同。服务的实现是我支持并且可以更改的代码。

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

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

例如:

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

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

或者如果它能够以某种方式支持查询字符串:

http://foo.com/service.svc?tenant1 和 http://foo.com/service.svc?tenant2 等...

或其他方式...

这样做的原因是调用它的客户端不会有任何租户的概念。从客户的角度来看,每个租户只有一个 Url。

问题

如何使用这样的“包罗万象”端点托管 WCF 服务?或者我可以通过路由或 url 重写来做到这一点吗?然后我可以将租户 ID 放入请求标头中,并修改服务代码以支持多租户。

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

【问题讨论】:

  • 当你说你不能修改Service Contract,是不是意味着你没有访问代码的权限?
  • 此外,foo.com/tenant/service.svc 和 foo.com/tenant1/service.svc 表示两种不同的 WCF 服务,无法通过一种服务实现。我认为您想参考 WCF REST 服务,您可以在其中进行操作......foo.com/Service.svc/tenant 和 foo.com/Service.svc/tenant1
  • @HarmeetBhamra 我可以修改服务代码,但不能修改合同,因为我无法修改客户端
  • @EdmundYeung99 - 如果您可以修改服务代码,您将拥有更多的灵活性。您可以修改现有服务合同并添加新方法——这对现有客户来说是一项非破坏性更改。只要现有客户期望的方法不改变,您可以在实际实现中做任何您想做的事情。
  • @Tim 我无法修改客户端,它们只能调用现有方法,因此无法创建新方法,因为没有客户端可以调用这些方法

标签: web-services wcf


【解决方案1】:

如果您无权访问服务代码或无法更改代码,则需要跳出思维定势。一种选择是在 IIS 中创建单独的应用程序,并希望您的服务允许您更改 web.config 值,以便您可以将服务配置为查看不同的数据库(如果这是支持它的话)。

但如果 web.config 路由没有捕获所有变量,您可能不得不考虑使用 IHttpModule。在服务堆栈中足够早地注入它可以让您选择使用 URL 执行您将要执行的操作,尽管您仍然无法控制随后被调用的代码,除非您完全覆盖被调用的内容并且不调用 base方法继续执行。

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

最后,如果可以删除实现服务契约的代码,您可以将一个 DLL 拖放到实现该契约的服务器上,然后更新 web.config 文件以指向该 DLL。尽管如果您删除的 DLL 也删除了其他代码的重要部分,这可能是不可能的。

如果您无权访问代码,您将会遇到困难,因为所有这些解决方案都是非常先进的概念。

【讨论】:

  • 我可以修改服务代码,只是不能修改合同。客户端只能调用现有的服务方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多