Генерация новой сессии ASP.NET в текущем HTTPContext

Он просто должен быть в пути к классам (также убедитесь, что он попадает под / WEB-INF / classes в .war как часть сборки).

26
задан Rabid 3 September 2009 в 02:29
поделиться

3 ответа

Для MVC4 используйте следующий код:

 System.Web.SessionState.SessionIDManager manager = new System.Web.SessionState.SessionIDManager();
            HttpContext Context = System.Web.HttpContext.Current;
            string oldId = manager.GetSessionID(Context);
            string newId = manager.CreateSessionID(Context);
            bool isAdd = false, isRedir = false;
            manager.SaveSessionID(Context, newId, out isRedir, out isAdd);
            HttpApplication ctx = (HttpApplication)System.Web.HttpContext.Current.ApplicationInstance;
            HttpModuleCollection mods = ctx.Modules;
            System.Web.SessionState.SessionStateModule ssm = (SessionStateModule)mods.Get("Session");
            System.Reflection.FieldInfo[] fields = ssm.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
            SessionStateStoreProviderBase store = null;
            System.Reflection.FieldInfo rqIdField = null, rqLockIdField = null, rqStateNotFoundField = null;
            foreach (System.Reflection.FieldInfo field in fields)
            {
                if (field.Name.Equals("_store")) store = (SessionStateStoreProviderBase)field.GetValue(ssm);
                if (field.Name.Equals("_rqId")) rqIdField = field;
                if (field.Name.Equals("_rqLockId")) rqLockIdField = field;
                if (field.Name.Equals("_rqSessionStateNotFound")) rqStateNotFoundField = field;
            }
            object lockId = rqLockIdField.GetValue(ssm);
            if ((lockId != null) && (oldId != null)) store.ReleaseItemExclusive(Context, oldId, lockId);
            rqStateNotFoundField.SetValue(ssm, true);
            rqIdField.SetValue(ssm, newId);
-1
ответ дан arunprakash 25 September 2019 в 07:35
поделиться

Рассматривали ли вы использование метода HttpSessionState.Abandon ? Это должно все прояснить. Затем запустите новый сеанс и заполните его всеми элементами, которые вы сохранили из приведенного выше кода.

Session.Abandon (); должно хватить. В противном случае вы могли бы попытаться пройти лишнюю милю, добавив еще несколько вызовов, если он все еще упрям:

Session.Contents.Abandon();
Session.Contents.RemoveAll(); 
0
ответ дан 28 November 2019 в 07:29
поделиться

Не могли бы вы просто установить:

<sessionState regenerateExpiredSessionId="False" />

в web.config, а затем использовать решение, предложенное Ахмадом?

0
ответ дан 28 November 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: