当然,Web 服务也能够处理多租户请求。在。NET 世界,实现 web 服务基本上有两个 API:Windows 通信基础 (WCF)和新的 Web API 。尽管它们有一些重叠的特性,但它们的架构和基本概念却大不相同。虽然对这些 API 的全面讨论超出了本书的范围,但让我们看看与多租户相关的一些要点。
默认情况下,WCF 不使用 ASP.NET 管道,这意味着 HttpContext。当前不可用。这是为了让 WCF 有一个更精简、更集中的模型,在这个模型中,不需要经典的管道(但是可以启用它)。
如果我们不想使用 ASP.NET 管道,我们需要改变租户识别策略的实施。在 WCF 方法调用中,总是可以通过操作上下文访问当前请求上下文。当前或网络运营上下文。当前(针对 REST web 服务)属性。因此,我们需要编写一个知道如何获取这些信息的租户识别策略的实现:
代码示例 67
public class WcfHostHeaderTenantIdentification : ITenantIdentifierStrategy
{
public String GetCurrentTenant(RequestContext context)
{
var request = WebOperationContext.Current.IncomingRequest;
var host = request.Headers["Host"];
return host.Split(':').First().ToLower();
}
}
另一方面,如果 ASP.NET 管道是一个选项,我们只需要通过 XML 配置启用它,通过aspnetcompatityenabled属性:
代码示例 68
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
或者,我们可以通过代码中的属性来启用它:
代码示例 69
[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class DateService : IDateService
{
//rest goes here
}
| | 注:关于 ASP.NET 兼容模式的讨论,请查看这篇文章。 |
ASP.NET 网络应用编程接口是用。NET 框架。它紧密遵循 ASP.NET MVC 模型,因此基于控制器和动作。
目前,它可以托管在 IIS(传统方式)或 OWIN 支持的主机上。在第一种情况下,所有经典的 ASP.NET API(System.Web.DLL)都可用,包括 HttpContext。目前的,所以你可以使用相同的策略实现,为 MVC 和网络表单描述。对于 OWIN,请阅读第 8 章中的一些提示。
只要 ASP.NET 经典 API 可用,我们就可以遵循第 5 章单元测试一节中描述的处方。对于 OWIN,跳到第八章。