我正在开发一个 ASP.NET MVC 多站点应用程序(可以托管来自同一应用程序实例/ Multi-Tenancy 应用程序的多个站点)。
我之前在 Web 表单应用程序中完成了此操作,并在自定义基页的 page_load 事件上加载了适当的站点配置数据(通过检查 url)。
使用 ASP.NET MVC,我最好在 Application_BeginRequest 中执行相同的操作吗?然后我可以将配置对象添加到 HttpContext.Current.Items。
最佳答案
我正在做一些与我正在开发的当前系统类似的事情。
我通过用户访问应用程序的 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
都是可用的。如果您有任何更具体的问题,请提出,我会让您知道我们做了什么。
更新
您在上面看到的是_siteService.GetSiteByHost(host)
。 SiteService
在它和存储库之间有一个缓存层,负责处理所有与缓存相关的内容。它定义为:
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;
}
除非我们处理简单的数据类型(例如整数),否则我们尽量不使用Session
。我不会在 session 中存储 Site
对象,但会在 session 中存储表示 SiteId
的整数。然后,下次用户访问应用程序时,我可以通过 Id 从缓存中获取与当前用户关联的 Site
对象。但在上面的情况下,这是没有必要的。
关于asp.net-mvc - ASP.NET MVC 多站点 - 存储站点配置数据的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672176/