カスタム SessionStateStores を扱う 2 番目の回答。コードを見ると、セッション開始を呼び出さない理由がわからなかったので、何が起こっているのかを確認するために、準拠しているが機能しない独自のセッション状態プロバイダーを作成しようとしました。私のセッション状態プロバイダーでは、global.asax の Session_start が正常に呼び出されました。コードをデモの概念実証として含めます。
セッション状態プロバイダー:
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
ため、そこにブレークポイントを配置して、そのメソッドの後にどこに向かうかを確認できます。