我正在构建一个多租户 ASP .NET 应用程序。鉴于每个租户都可以动态配置他们的应用程序(这可能涉及将动态自定义程序集加载到内存中),我需要一种隔离每个租户的方法。
出于维护原因,我不希望为每个租户创建一个新的 Web 应用程序。
我一直在考虑使用 AppDomainManager 为每个应用程序创建一个 AppDomain,但似乎这不适用于 ASP .NET 应用程序。
有人对这个问题有什么建议吗?
谢谢。
我正在构建一个多租户 ASP .NET 应用程序。鉴于每个租户都可以动态配置他们的应用程序(这可能涉及将动态自定义程序集加载到内存中),我需要一种隔离每个租户的方法。
出于维护原因,我不希望为每个租户创建一个新的 Web 应用程序。
我一直在考虑使用 AppDomainManager 为每个应用程序创建一个 AppDomain,但似乎这不适用于 ASP .NET 应用程序。
有人对这个问题有什么建议吗?
谢谢。
我想问题是:如果您不喜欢创建 Web 应用程序,那么您真正可以接受哪种类型的隔离?
如果您真的想要一种操作系统级别的保证,即程序集不会相互影响,我会给每个程序集自己的 Web 应用程序。如果您允许人们加载第三方程序集,则尤其如此,如果这些第三方程序集可以找到实例化非托管代码的方法,则尤其如此。
如果它是您的所有(托管)代码,我可以看到不会创建单独的 Web 应用程序,但是一旦您将动态自定义程序集放入混合中,我认为这是唯一的方法。
当您创建不同的网站时,您的 URL 根肯定会发生变化。我在想为什么不在主应用程序中使用不同的应用程序,并在需要时将它们放在不同的应用程序池中?
一...这样,根 URL 将保持不变。二... 创建一个 VDir 或应用程序的一个实例。哪一个需要动态?三...我没有专业知识。
如果我必须共享页面,[基于托管在不同 VDir 中的应用程序],我会为我的所有共享页面创建一个新的 VDir。并使用一些自定义代码来显示应用程序相关数据。
我在 MVC2 中编写了多租户 Web 应用程序。添加/删除帐户与在表中添加/删除一行一样复杂,因为我选择了共享数据库、共享模式方法。
这是一篇来自 MSDN 的关于多租户数据库设计的非常好的文章:Multi-Tenant Data Architecture
我在 MVC 中所要做的就是正确设置路由,因此路径的第一部分是帐户名:
我有一个自定义 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用于任何特定于客户端的业务逻辑定制。