Источник для состояния сеанса: https://github.com/Microsoft/referencesource/blob/master/System.Web/State/ Документы: https://docs.microsoft.com/en-us/dotnet/api/system.web.sessionstate?view=netframework-4.7.2
Я бы начал с проверки справочного источника, чтобы вы могли искать в базе кода.Один интерфейс выглядит как потенциально интересный. IPartialSessionState
(При реализации в типе возвращает список из нуля или более ключей сеанса, которые указывают поставщику состояния сеанса, какие элементы состояния сеанса должны быть получены.) Источник здесьhttps://docs.microsoft.com/en-us/dotnet/api/system.web.sessionstate.ipartialsessionstate?view=netframework-4.7.2
Я наткнулся на https://www.wiktorzychla.com/2007/06/wrapped-inprocsessionstatestore.html через ASPNET: переключение между поставщиками состояний сеанса? .
Теоретически эту технику можно использовать и с поставщиком Redis.,Вам нужно будет либо сохранить список ключей, пригодных для хранения в Redis, либо попытаться сериализовать / перехватить / кэшировать результат, типы которого можно сериализовать, и адаптивно использовать поведение InProc.Вы должны иметь возможность использовать HttpContext.Current.Items для передачи информации между событиями в конвейере обработки запросов.
SessionStateModule (модуль, отвечающий за получение сеанса, блокировку, сохранение, разблокировку и т. Д.), Кажется, обрабатываетInProc как особенный в нескольких местах.Найдите его код для InProc.По сути, вы пытаетесь подключить волшебный провайдер, который является Custom, но все еще имеет всю семантику InProc, применяемую одним-единственным SessionStateModule.Вы не сможете /, вероятно, не захотите модифицировать этот модуль, но вы можете подключить другой, смежный с ним, который подключается к связанным событиям в конвейере запросов и делает все, что нужно сделать, либоIn-Proc или пользовательские.Вы, вероятно, столкнетесь с внутренними / частными методами, для которых вам нужно будет использовать рефлексию.Не уверен, как лицензирование работает с эталонным источником (я думаю, MS-PL), но другой вариант - скопировать и вставить код из SessionStateModule в свой собственный, внести необходимые изменения, отменить регистрацию оригинала и зарегистрировать замену.
Я думаю вы застрянете, работая с большим количеством кода отражения, чтобы заставить это работать.