首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HttpContext.Current.Session在时间事件上为空

HttpContext.Current.Session在时间事件上为空
EN

Stack Overflow用户
提问于 2014-05-26 13:37:27
回答 1查看 1K关注 0票数 1

我开发了一个基于ASP.NET的电子商务系统和一个叫做MicrosoftDynamicAX4.0的ERP系统。

对于每个HTTP会话,我使用“业务连接器”(一个.NET组件)登录到ERP系统。“业务连接器”-object存储在一个-object中因此,在普通的Session_end中,我将从Dynamics注销并清理所有资源。

ERP系统是一个基于32位的系统,为了节省资源,我想开发一个计时器,在某一段时间不工作之后,它将退出ERP系统。让我们说两分钟。Http会话超时设置为20分钟。

我创建了一个类,"TimerHandler“,它使用System.Timers.Timer,每当用户单击与ERP系统相关的东西(项目、篮子等)时,它就启动并重新启动计时器。

示例代码:

代码语言:javascript
运行
复制
public class ErpHandler
{
    private ErpTimerHandler TimerHandler
    {
        get
        {
            if (HttpContext.Current != null)
            {
                if (HttpContext.Current.Session["TimerHandler"] != null)
                {
                    return (ErpTimerHandler)HttpContext.Current.Session["TimerHandler"];
                }
            }
            return null;
        }
       set
        {
            if (HttpContext.Current != null)
            {
                HttpContext.Current.Session["TimerHandler"] = value;
            }
        }
    }

    private void StartTimer()
    {
        ErpTimerHandler timer = TimerHandler;
        if timer == null)
        {
            timer = TimerHandler.Instance();
            timer.TimerEvent += OnTimedEvent;   
            TimerHandler = timer;
        }

        timer.StartTimer();

    }

    private void StopTimer()
    {
        ErpTimerHandler timer = TimerHandler;
        if (timer != null)
        {
            timer.StopTimer();
            TimerHandler = null;
        }
    }

    private void OnTimedEvent(Object source, EventArgs e)
    {
        StopTimer();
        ErpLogOff();
    }

    public void ErpLogOff()
    {
        ErpSystem erp = ErpInstance;            
        if (LoggedOnErp && erp != null)
        {
            erp.Logoff();
            ErpInstance = null;
        }
        LoggedOnErp = false;

    }
}

这段代码永远不会在OnTimedEvent上注销Erp,因为HttpContext.Current.Session是空的。

据我所知,计时器运行在不同的线程上,因此当我需要时,当前会话不可用。

那么,我到底该如何“到达”那根线呢?或者我可以确保计时器运行在与会话相同的线程上吗?

EN

回答 1

Stack Overflow用户

发布于 2014-05-26 13:52:18

HttpContext.Current仅在请求生存期内有效。当您的计时器触发时,请求可能已经处理和完成很久了。

如果要为特定用户处理某些数据,则可能应该将会话字典中的信息复制到某种数据持有者中。

下面是一种解决方案,它使用内置缓存来检测会话何时过期:http://www.ivan-nikolov.com/en/article/5/asp-net-session-state-mode-and-session-end-callback

该解决方案基本上是在用户登录时将一个项插入缓存,然后在每个请求上更新缓存。最后,它使用缓存过期事件来检测会话何时过期。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23871438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档