2010-10-10 36 views
13

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

由于维护原因,我不希望为每个租户创建新的Web应用程序。

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

有没有人有这方面的一些建议?

谢谢。

回答

5

我想问题是:如果你不想创建一个Web应用程序,那么你真的可以接受什么类型的隔离?

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

我看不到创建一个单独的Web应用程序,如果它是你所有的(托管)代码,但是一旦你把动态自定义程序集放入组合中,我认为这是唯一的出路。

+0

我其次,关键短语是“自定义程序集”。 – 2010-10-10 14:48:42

+0

好吧,我肯定会考虑这一点,但我有一些担忧。一个 - 应用程序应该都有相同的根URL ......这甚至可能吗?二 - 创建和删除需要自动...我应该使用WMI吗?我不知道我对此有什么感觉......无论如何,IIs支持多少web应用程序?这是否会在硬件云中扩展,因为这个限制会有OS?三 - 我们希望这个解决方案能够与Azure兼容(但不是Azure特定的),那么我将如何去管理Azure? – Jeff 2010-10-10 21:34:06

+0

另外,您会如何建议处理共享资源(页面)?从共享dll中提取页面的VirtualPathProvider? – Jeff 2010-10-10 21:48:07

1

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

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

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

+0

我该如何去动态创建应用程序是个问题呢? – Jeff 2010-10-20 14:05:33

+0

如果您使用的是IIS 7,则可以使用IIS虚拟目录的代理配置给最终用户,以便他们可以配置其应用程序。 – 2010-10-20 14:34:10

+0

或者,您可以使用SharePoint或DotNetNuke。如果我正确理解您的问题,则可以使用SharePoint创建网站定义,并让任何人将其用作其自己网站的模板。 – 2010-10-20 14:35:45

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); 
    } 
} 

因为它是由安德烈亚斯三位的关键短语是“自定义组件”。为什么你需要'自定义程序集'进行配置?你在使用CodeEmit吗?用户会上传他们吗?我宁愿考虑将Windows Workflow Foundation用于任何客户特定的业务逻辑定制。

+0

我实际上已经建立了特定于租户的MVC路线,这些路线非常棒。自定义程序集的目的是租户必须能够使用自定义页面和代码来定制他们的“实例”。为此目的分离任何自定义代码是关键。 – Jeff 2010-10-20 13:25:06

+0

为了进一步澄清,是的,用户将上传自定义程序集,这些程序集将被编译并在应用程序域中运行。问题是这些程序集需要某种形式的隔离,以致无法访问其他租户的数据。我已经有防止自定义程序集进行数据库调用的代码,但是我担心静态上下文,例如应用程序状态或静态属性/方法/字段。 – Jeff 2010-10-20 14:04:31

+0

我已经考虑为这些自定义程序集动态地创建应用程序域,但我更喜欢集成的东西,因为asp.net已经为我管理应用程序域。另外,我不知道如何让我的自定义应用程序域进入asp.net的请求生命周期(能够发布渲染的aspx页面) – Jeff 2010-10-20 14:08:45