[英]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中所要做的就是正确设置路由,因此路径的第一部分是帐户名:
我有一个自定义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.