我正在开发一个ASP.NET MVC多站点应用程序(可以从同一个应用程序实例/多租户应用程序托管多个站点)。
我之前在Web表单应用程序中完成了此操作,并在自定义基页的page_load事件中加载了相应的站点配置数据(通过检查URL)。
使用ASP.NET MVC,我最好在Application_BeginRequest中做同样的事情吗?然后我可以将配置对象添加到HttpContext.Current.Items。
答案 0 :(得分:2)
This blogger看起来是一篇关于asp.net-mvc中多租户的一系列文章
你提到的听起来像是一种可行的方式来做你想做的事,虽然它可能不是惯用的解决方案。
答案 1 :(得分:2)
我正在做与我正在研究的当前sytsem类似的事情。
我正在通过用户访问应用程序的URL来确定网站,如下所示:
public class BaseController : Controller
{
protected override void Initialize(RequestContext requestContext)
{
var host = requestContext.HttpContext.Request.Url.Host;
Site = _siteService.GetSiteByHost(host);
base.Initialize(requestContext);
}
}
我系统中的每个Controller都扩展了BaseController,因此Site对象可用于每个Controller。如果您有任何更具体的问题,请询问,我会告诉您我们做了什么。
<强> upate 强>
您在上面看到的是_siteService.GetSiteByHost(host)
。 SiteService在它和Repository之间有一个缓存层,它负责处理所有缓存相关的东西。它被定义为:
public Site GetSiteByHost(string host)
{
string rawKey = GetCacheKey(string.Format("GetSiteByHost by host{0}", host));
var site = (Site)_cachingService.GetCacheItem(rawKey);
if (site == null)
{
site = _siteRepository.GetSiteByHost(host);
AddCacheItem(rawKey, site);
}
return site;
}
我们尽量不使用Sesson,除非我们处理简单的数据类型,比如int。我不会在Session中存储Site对象,但我会在会话中存储一个代表SiteId的int。然后,当用户下次访问应用程序时,我可以通过Id从缓存中获取与当前用户关联的Site对象。在上面的情况下虽然没有必要。