我有以下需求:
当发生特定事件(由应用程序的随机组件触发)时,我希望能够对应用程序的所有已连接用户的Session对象进行修改。
为此,当用户登录应用程序时,我使用针对该用户特定会话的自定义方法订阅该事件。因此,我实例化了我的侦听器并调用了我的订阅方法。
SecurityChangeListener securityChangeListener = new SecurityChangeListener();
securityChangeListener.SubscribeForUserSession(_httpContextAccessor.HttpContext.Session);
其中securityChangeListener是我的侦听器类,并且该侦听器类具有以下实现:
public class SecurityChangeListener
{
private ISession _session;
public void SubscribeForUserSession(ISession session)
{
_session = session;
EventsHub.MyEvent += MyHandler;
Logger.Info("Subscribed to event for session " + _session.Id);
}
private void EventsHubOnParameterElementChanged(object sender, EntityChangeEventArgs<IParameterElement> e)
{
Logger.Info($"Executing handler for session {_session.Id}");
_session.Remove("MyKey1");
}
}
实际代码更长,但我只保留了主要摘录。
该事件已正确挂接到侦听器,该事件将按我每个用户的特定会话的预期进行调用。
但是“ Session.Remove”不能按预期运行: 如果我查看调试会发生什么,该密钥将在事件方法中的本地“ _session”对象上删除(之前存在,之后消失)。 但是,当程序的其余部分恢复运行时,密钥又回来了,就像我在会话中什么都不给。
显然,“ _ session”对象只是实际会话的某种副本,而不是对原始会话对象本身的引用。
是否有一种方法可以像我正在尝试的那样在ASP.Net Core中管理会话,或者更一般地,一种访问所有现有会话列表并更改其内容的方法? 我在MVC Core中找不到与会话管理相关的任何内容。
感谢帮助