我编写了一个HTTP会话状态模块来处理我的自定义会话状态提供程序
您知道Session_Start
和Session_End
将以InProc
模式运行,而不是自定义模式。
所以我希望Global.asax处理Session_Start
方法(使用我的自定义会话模块和提供程序)将其提升到我的应用程序的一些初始化。
我发现this Article在StateServer模式下处理Sessoin_End
事件,但处理启动事件怎么样?!
我的模块的开始事件:
public sealed class MyCustomSessionStateModule : IHttpModule
{
...
/*
* Add a Session_OnStart event handler.
*/
public static event EventHandler Start
{
add
{
_sessionStartEventHandler += value;
}
remove
{
_sessionStartEventHandler -= value;
}
}
...
}
我的Web.config模块配置:
<httpModules>
<remove name="Session"/>
<add name="MyCustomSessionStateModule" type="CustomSessionStateServer.MyCustomSessionStateModule" />
</httpModules>
我的Web.config提供程序配置:
<sessionState mode="Custom" customProvider="CustomSessionStateStoreProvider" timeout="20">
<providers>
<add name="CustomSessionStateStoreProvider" type="CustomSessionStateServer.CustomSessionStateStoreProvider" />
</providers>
</sessionState>
我在一个结构中编写了我的模块,session_start将在AcquireRequestState的开始时间中触发。
/*
* IHttpModule Member
*/
public void Init(HttpApplication app)
{
...
// Handling OnAcquireRequestState Asynchronously
app.AddOnAcquireRequestStateAsync(
new BeginEventHandler(this.app_BeginAcquireState),
new EndEventHandler(this.app_EndAcquireState));
...
}
private IAsyncResult app_BeginAcquireState(object source, EventArgs e, AsyncCallback cb, object extraData)
{
...
if (_rqIsNewSession)
{
// Firing Sessoin_Start Event
_sessionStartEventHandler(this, EventArgs.Empty);
}
}
根据ASP.net Application Life Cycle会话状态必须在AcquireRequestState
事件中提供。但我仍然在Gloabal.asax的Session_Start中有空的Session对象
我根据Microsoft's .NET 4.5 framework SessionStateModule Source Code编写了这个模块。