windows azure asp.net MVC2中的多租户

Joã*_*tos 4 asp.net azure multi-tenant asp.net-mvc-2

任何人都知道如何开始在MVC2中开发多租户网站,它在Windows Azure上运行?

我搜索了很多关于这个问题,我总是找到理论解释,每个人都说它很容易完成,但我找不到任何样本......

有人可以解释我从哪里开始?

谢谢,João

Mat*_*ley 5

这取决于您计划如何实施多租户(例如,使用具有公共URL,子域,自定义域或任何组合的授权).但是你应该能够使用Azure和MVC2做任何方法.如果您计划为每个租户使用自定义域而不是子域,则需要使用CNAME条目(而不是A记录)将每个自定义域指向Azure,但这通常不是问题.

MVC提供了许多扩展点,您可以在其中实现各种风格的多租户.主要目标是通过登录或URL唯一地标识用户.

我们在Azure中运行了一个MVC2应用程序,它解析请求URL以区分租户.有很多方法可以做到这一点.我们采用扩展Controller类的方法为我们的应用程序提供独特的租户信息,以便我们可以根据需要使用它来进行适当的存储库调用以显示正确的视图等.

以下是MultiTenant 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 上面的RequestParser函数只是知道如何以安全的方式解析URL的任何实现.
  2. _tenantService 可以访问某种持久性存储(在我们的例子中为Azure Tables),以从url中的主机地址获取TenantCode.

所有控制器都将继承上述类.然后,为了区分租户,您只需在控制器中引用TenantCode,如下所示:

public class HomeController : MultiTenantController {
    ...

    public ViewResult Index() {
        var vm = _homeService.GetHomePageViewModelForTenant(TenantCode);
        return View(vm);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用上述实现,您可以将不同的网站或数据提供给以下网址:
http://subtenant1.yourdomain.com
http://subtenant2.yourdomain.com
http://www.customtenantdomain.com

您的后端存储(例如,表存储)只需要与租户交叉引用主机名,如下表所示.在上面的代码中,GetTenantCode将访问数据.

HostName                TenantCode
---------------------- --------------  
subtenant1              Tenant1ID  
subtenant2              Tenant2ID  
www.customtenantdomain  Tenant3ID  
Run Code Online (Sandbox Code Playgroud)

要使www.customtenantdomain.com正常工作,租户需要在其指向Azure Web角色地址的customtenantdomain.com的DNS记录中使用www的CNAME条目.