# 六、网络服务

## 简介

当然，Web 服务也能够处理多租户请求。在。NET 世界，实现 web 服务基本上有两个 API:[Windows 通信基础](https://msdn.microsoft.com/en-us/library/dd456779.aspx) (WCF)和新的 [Web API](http://www.asp.net/web-api) 。尽管它们有一些重叠的特性，但它们的架构和基本概念却大不相同。虽然对这些 API 的全面讨论超出了本书的范围，但让我们看看与多租户相关的一些要点。

## 周转框架

默认情况下，WCF 不使用 ASP.NET 管道，这意味着 HttpContext。当前不可用。这是为了让 WCF 有一个更精简、更集中的模型，在这个模型中，不需要经典的管道(但是可以启用它)。

如果我们不想使用 ASP.NET 管道，我们需要改变租户识别策略的实施。在 WCF 方法调用中，总是可以通过[操作上下文访问当前请求上下文。当前](https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontext.current.aspx)或[网络运营上下文。当前](https://msdn.microsoft.com/en-us/library/system.servicemodel.web.weboperationcontext.current.aspx)(针对 REST web 服务)属性。因此，我们需要编写一个知道如何获取这些信息的租户识别策略的实现:

代码示例 67

```cs
          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](https://msdn.microsoft.com/en-us/library/ms731336.aspx)属性:

代码示例 68

```cs
          <system.serviceModel>
               <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
         </system.serviceModel>

```

或者，我们可以通过代码中的属性来启用它:

代码示例 69

```cs
          [AspNetCompatibilityRequirements(
                RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
          public class DateService : IDateService
         {
                //rest goes here
         }

```

| ![](img/note.png) | 注:关于 ASP.NET 兼容模式的讨论，请查看[这篇文章](http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx)。 |

## Web API

[ASP.NET 网络应用编程接口](http://www.asp.net/web-api)是用。NET 框架。它紧密遵循 ASP.NET MVC 模型，因此基于控制器和动作。

目前，它可以托管在 IIS(传统方式)或 OWIN 支持的主机上。在第一种情况下，所有经典的 ASP.NET API(**System.Web.DLL**)都可用，包括 [HttpContext。目前的](https://msdn.microsoft.com/en-us/library/system.web.httpcontext.current.aspx)，所以你可以使用相同的策略实现，为 MVC 和网络表单描述。对于 OWIN，请阅读第 8 章中的一些提示。

## 单元测试

只要 ASP.NET 经典 API 可用，我们就可以遵循第 5 章单元测试一节中描述的处方。对于 OWIN，跳到第八章。