这取决于您计划如何实施多租户(例如,使用通用 url、子域、自定义域或任何组合的授权)。但是您应该能够使用 Azure 和 MVC2 执行任何方法。如果您计划为每个租户使用自定义域,而不是子域,则需要对使用 CNAME 条目(而不是 A 记录)将每个自定义域指向 Azure 感到满意,但这通常不是问题。
MVC 提供了许多扩展点,您可以在其中实现各种风格的多租户。主要目标是通过登录名或 url 来唯一标识用户。
我们有一个在 Azure 中运行的 MVC2 应用程序,它解析请求 url 以区分租户。有很多方法可以做到这一点。我们采用扩展 Controller 类的方法为我们的应用程序提供唯一的租户信息,以便我们可以根据需要使用它来进行适当的存储库调用以显示适当的视图等。
以下是多租户控制器的示例:
public class MultiTenantController : Controller {
public string TenantCode { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
TenantCode = GetTenantCode(filterContext.HttpContext.Request);
}
private string GetTenantCode(System.Web.HttpRequestBase request) {
string host = new RequestParser(request.Url.AbsoluteUri).Host;
return _tenantService.GetTenantCodeByHostAddress(host);
}
}
注意事项:
-
RequestParser 函数
以上只是任何实现
知道如何解析 url
安全的方式。
-
_tenantService
可以访问某种持久的
存储(在我们的例子中是 Azure 表)到
从主机获取租户代码
网址中的地址。
您的所有控制器都将从上述类继承。然后,为了区分租户,您只需引用控制器中的 TenantCode,如下所示:
public class HomeController : MultiTenantController {
...
public ViewResult Index() {
var vm = _homeService.GetHomePageViewModelForTenant(TenantCode);
return View(vm);
}
}
使用上述实现,您可以为不同的网站或数据提供如下网址:
http://subtenant1.yourdomain.com
http://subtenant2.yourdomain.com
http://www.customtenantdomain.com
您的后端存储(例如表存储)只需要与租户交叉引用主机名,如下表所示。在上面的代码中,GetTenantCode 将访问数据。
HostName TenantCode
---------------------- --------------
subtenant1 Tenant1ID
subtenant2 Tenant2ID
www.customtenantdomain Tenant3ID
要使 www.customtenantdomain.com 正常工作,租户需要在其 customtenantdomain.com 的 DNS 记录中的 www 的 CNAME 条目指向您的 Azure Web 角色的地址。