我有一个ASP.net MVC项目,该项目连接到外部框架,因此它需要为每个用户刷新其连接对象,因为框架连接对象拥有用户角色和权限。
我有一个基本控制器,需要检查连接是否存在:
[SessionState(System.Web.SessionState.SessionStateBehavior.Required)]
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpSessionStateBase session = filterContext.HttpContext.Session;
if (Session["ExtFrameworkConnectionObj"] == null)
{
HttpContext.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
Response.Redirect("/Login", true);
}
else
{
(Session["ExtFrameworkConnectionObj"] as ExternalFrameworkConnectionWrapper).Refresh();
}
}
}
在ExternalFrameworkConnectionWrapper中,我们有一个缓存机制,该机制使用围绕.net 4 ObjectCache的自定义包装:
internal class CacheClass
{
private static volatile CacheClass _instance;
private static ObjectCache cache = MemoryCache.Default;
public static CacheClass Instance
{
get
{
if (_instance == null)
{
lock (lockObj)
{
if (_instance == null)
{
_instance = new CacheClass();
}
}
}
return _instance;
}
}
}
在ExternalFrameworkConnectionWrapper构造函数中初始化如下:
public class ExternalFrameworkConnectionWrapper
{
private CacheClass cache;
private ExtFramework extfrmObj;
public ExternalFrameworkConnectionWrapper()
{
cache = CacheClass.Instance;
}
public void Refresh()
{
extfrmObj.Refresh();
}
}
因此,通常,我将连接对象存储在会话中,该会话本身具有缓存机制!并且在每个请求中都提取并检查了该对象。
我认为这可能会导致性能方面的麻烦,特别是在尝试初始化实例时(有时我们会遇到较差的登录性能)。
任何对提供更好结构的帮助将不胜感激。我应该使用并发字典还是静态ObjectCahce代替会话?
注意:外部框架连接对象根本不是轻量级的,每个用户可能达到15MB。