将外部连接对象存储在基本控制器内的会话中

时间:2018-07-12 05:18:14

标签: asp.net asp.net-mvc performance session

我有一个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。

0 个答案:

没有答案