Второй ответ, касающийся пользовательских SessionStateStores.Посмотрев на код, я не увидел причин, по которым он не будет вызывать начало сеанса, поэтому я попытался создать своего собственного совместимого, но не функционального поставщика состояния сеанса, чтобы увидеть, что происходит.С моим провайдером состояния сеанса он вызывал Session_start в global.asax нормально.Я включил свой код в качестве демонстрационного подтверждения концепции:
Поставщик состояния сеанса:
namespace WebApplication1
{
public class SessionStateProvider : System.Web.SessionState.SessionStateStoreProviderBase
{
public override SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout)
{
ISessionStateItemCollection foo = new SessionStateItemCollection();
HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
return new SessionStateStoreData(foo, bar, 300);
}
public override void CreateUninitializedItem(HttpContext context, string id, int timeout){}
public override void Dispose() { }
public override void EndRequest(HttpContext context) { }
public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
{
locked = false;
lockAge = TimeSpan.FromSeconds(10);
lockId = new object();
actions = SessionStateActions.None;
ISessionStateItemCollection foo = new SessionStateItemCollection();
HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
return new SessionStateStoreData(foo, bar, 300);
}
public override SessionStateStoreData GetItemExclusive(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions)
{
locked = false;
lockAge = TimeSpan.FromSeconds(10);
lockId = new object();
actions = SessionStateActions.None;
ISessionStateItemCollection foo = new SessionStateItemCollection();
HttpStaticObjectsCollection bar = new HttpStaticObjectsCollection();
return new SessionStateStoreData(foo, bar, 300);
}
internal virtual void Initialize(string name, NameValueCollection config, IPartitionResolver partitionResolver) { }
public override void InitializeRequest(HttpContext context) { }
public override void ReleaseItemExclusive(HttpContext context, string id, object lockId) { }
public override void RemoveItem(HttpContext context, string id, object lockId, SessionStateStoreData item) { }
public override void ResetItemTimeout(HttpContext context, string id) { }
public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) { }
public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback){return true;}
}
}
Global.asax:
protected void Session_Start(object sender, EventArgs e)
{
throw new Exception("It worked!");
}
web.config:
<sessionState mode="Custom" customProvider="MySessionProvider">
<providers>
<add name="MySessionProvider" type="WebApplication1.SessionStateProvider"/>
</providers>
</sessionState>
Суть этого поста в основном состоит в том, чтобы сказать, что если вы используете предоставленный модуль управления сеансом, даже с пользовательским провайдером, он все равно должен запускать событие session_start.Возможно, вы можете попробовать с моим фиктивным государственным провайдером и посмотреть, не вызовет ли это ваше мероприятие.Также я предполагаю, что подпись вашего session_onstart действительно верна?(т.е. без параметров или (object, eventargs)).
В настоящее время мы находимся в тупом положении, потому что вся информация, которую мы имеем до сих пор, идет по неправильным линиям.Теперь у нас осталось либо то, что ваш sessionstateprovider вызывает сессию session_start, либо что-то в остальной части вашего кода.Использование моего манекена должно помочь нам ответить на этот вопрос (я надеюсь).
Для чего стоит событие session_start, которое должно быть запущено сразу после запуска метода CreateNewStoreData
в классе вашего провайдера, так что вы можете попробовать вставитьточка останова там и просто посмотреть, куда он направляется после этого метода.