多租户ASP .NET应用程序中的隔离

时间:2010-10-10 14:35:03

标签: c# .net asp.net appdomain multi-tenant

我正在构建一个多租户ASP .NET应用程序。鉴于每个租户可以动态配置他们的应用程序(可能涉及将动态自定义程序集加载到内存中),我需要一种隔离每个租户的方法。

出于维护原因,我不想为每个租户创建一个新的Web应用程序。

我一直在考虑使用AppDomainManager为每个应用程序创建一个AppDomain,但似乎并不打算用于ASP .NET应用程序。

有没有人对这个问题有一些建议?

感谢。

3 个答案:

答案 0 :(得分:5)

我想问题是:如果您不想创建Web应用程序,那么您真正可以接受哪种隔离?

如果你真的想要一个操作系统级保证程序集不会相互踩踏,我会给每个人自己的Web应用程序。如果您允许人们加载第三方程序集,则尤其如此,如果这些第三方程序集可以找到实例化非托管代码的方法,则尤其如此。

如果它是你的所有(托管)代码,我可以看到没有创建单独的Web应用程序,但是一旦你将动态自定义程序集放入混合中,我认为这是唯一的方法。

答案 1 :(得分:1)

当您创建不同的网站时,您的网址根本肯定会改变。我在想为什么不在主应用程序中使用不同的应用程序,并在需要时将它们放在不同的应用程序池中?

一个......那样,根URL将保持不变。 二...创建VDir或应用程序的实例。哪一个需要动态? 三......我没有专长。

如果我必须共享页面,[基于托管在不同VDir中的应用程序],我会为所有共享页面创建一个新的VDir。并使用一些自定义代码来显示与应用程序相关的数据。

答案 2 :(得分:1)

我在MVC2中编写了多租户Web应用程序。添加/删除帐户与添加/删除表中的行一样复杂,因为我选择了共享数据库,共享模式方法。

这是一篇关于MSDN多租户数据库设计的非常好的文章: Multi-Tenant Data Architecture

我在MVC中所做的就是正确设置路由,因此路径的第一部分是帐户名称:

  • www.yourdomain.com/Account1 /...
  • www.yourdomain.com/Account2 /...
  • www.yourdomain.com/Account3 /...

我有一个自定义MvcHandler用于查找每个请求的帐户:

public class AccountMvcHandler : MvcHandler
{
    public AccountModel Account { get; set; }

    public AccountMvcHandler(RequestContext requestContext)
        : base(requestContext)
    {
    }

    protected override IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
    {
        string accountName = this.RequestContext.RouteData.GetRequiredString("account");
        Account = ServiceFactory.GetService<IAccountService>().GetAccount(accountName);

        // URL doesn't contain valid account name - redirect to login page with Account Name textbox
        if (Account == null)
            httpContext.Response.Redirect(FormsAuthentication.LoginUrl);

        return base.BeginProcessRequest(httpContext, callback, state);
    }
}

正如Andreas Paulsson所说,关键词是“自定义组件”。为什么需要“自定义组件”进行配置?你在使用CodeEmit吗?用户会上传吗?我宁愿考虑使用 Windows Workflow Foundation 进行任何特定于客户端的业务逻辑定制。