У нас также был пользовательский поставщик сеансов, который использовал более эффективное кэширование, поэтому я смог воспользоваться этим, чтобы создать сеанс самостоятельно.Вот мой код, если кому-то еще это интересно, но учтите, что вам придется настроить его самостоятельно, если вы хотите заимствовать:
public void EnsureSessionExists(HttpContext context) {
if (context.Session != null) {
// Hey, we've already got a session. That was easy...
return;
}
bool isNew = false;
string sesId = _sessionIdManager.GetSessionID(context);
if (String.IsNullOrEmpty(sesId)) {
// if ID is null or empty, it means we're creating a new session?
sesId = _sessionIdManager.CreateSessionID(context);
}
SessionStateStoreData data = GetSessionDataStore(context, sesId);
if (data == null) {
isNew = true;
data = CreateNewStoreData(context, _sessionTimeout);
// Create doesn't put it in the cache. This does.
SetSessionDataStore(context, sesId, data);
}
HttpSessionStateContainer container = new HttpSessionStateContainer(sesId, data.Items, data.StaticObjects, data.Timeout, isNew, HttpCookieMode.UseCookies, SessionStateMode.Custom, false);
SessionStateUtility.AddHttpSessionStateToContext(context, container);
// Force the cookie to get set here. SessionStateModule only sets it if the Handler has IRequiresSessionState
HttpCookie cookie = new HttpCookie("ASP.NET_SessionId", _sessionIdManager.Encode(sesId));
cookie.Expires = DateTime.MinValue; // DateTime.MinValue makes it a session cookie.
context.Response.Cookies.Add(cookie);
}
Большая часть головоломки - это получение объекта SessionStateStoreData.Если вы используете реализацию по умолчанию, весело проведите время, просматривая рефлектор .NET, чтобы выяснить, как получить к нему доступ!
Кроме того, одним из недостатков этого является то, что SessionStateModule создает cookie только после фактического изменения сеанса.,Однако, просматривая этот код, я вынужден все время создавать cookie, хотя на самом деле я использую сеанс только в очень редком случае.