繁体   English   中英

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

[英]Isolation in a Multi-tenant ASP .NET Application

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

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

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

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

谢谢。

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

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

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

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

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

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

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

这是一篇关于MSDN多租户数据库设计的非常好的文章: 多租户数据架构

我在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进行任何特定于客户端的业务逻辑定制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM