Я не уверен, что это "хороший" способ ... но вы можете очень ловко хранить ссылку на Session в общей / статической переменной и затем обращаться к ней.
Public Class SessionHelper
Public Shared TheSession As HttpSessionState
End Class
В вашем событии начала сеанса (насколько я знаю, пока не нашли лучшего места для его размещения, поскольку сеанс недоступен в запуске приложения)
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' Store a reference...only do this once etc etc
If SessionHelper.TheSession Is Nothing Then
SessionHelper.TheSession = HttpContext.Current.Session
End If
End Sub
Тогда в вашем коде вы можете просто ссылаться на помощника
Dim someVariable as String = SessionHelper.TheSession.Item("ItemName")
Несколько вещей, в которых я не уверен:
- не уверен, что объект сеанса теперь не является потокобезопасным
- это не совсем правильно
- этот пример чрезвычайно прост ...
Редактировать
Я убедился, что это работает для меня, добавив что-то в кеш и проверив, доступен ли сеанс в обратном вызове удаления кэша, в котором Http.Context.Current недоступен.
Редактировать 2
Вот скриншот того, как правильно вернуть значение. Так что это должно работать в некоторой степени, но тот факт, что SessionId не установлен, вызывает некоторое беспокойство ... Я знаю, что я использовал эту технику прежде, чтобы получить доступ к объекту Cache, но кеш - это кеш, где в качестве сеанса нужно что-то, чтобы идентифицировать каждый сеанс ...
![enter image description here](https://i.stack.imgur.com/OM4da.png)