如何从自定义HTTP会话状态模块中解除Global.asax的Session_Start事件?

时间:2014-10-08 11:53:23

标签: c# asp.net .net session session-state

我编写了一个HTTP会话状态模块来处理我的自定义会话状态提供程序 您知道Session_StartSession_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编写了这个模块。

0 个答案:

没有答案