代码之家  ›  专栏  ›  技术社区  ›  Vivian River

从自定义ASP.NET SessionStateProvider类引发会话启动事件

  •  2
  • Vivian River  · 技术社区  · 15 年前

    我正在处理一个asp.net项目,该项目使用内部开发的自定义SessionStateProvider类。

    当我使用自定义SessionStateProvider类时,我必须做些什么来执行Session\u OnStart代码?我可以访问源代码。

    更新 :MSDN上明确表示, Session_OnStart 只有在会话模式为InProc时才会触发,所以我必须做一些特殊的事情来按照我想要的方式连接它。

    我在web.config中的会话状态配置如下所示:

    < sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom"  
     customProvider="ProgramSessionStateProvider"  
     sessionIDManagerType="SessionIDManager.ProgramSessionIDManager"  
    sqlConnectionString="SqlSessionServices" cookieName="smartSessionID" >
    < providers >
                < add name="ProgramSessionStateProvider"   
    type="SessionStateProvider.ProgramSessionStateProvider"   
    connectionStringName="SqlSessionServices" writeExceptionsToEventLog="false" / >  
            < /providers >
        < /sessionState >
    

    :今天早上我发现了一些有趣的东西。在读了克里斯的答案后,我试着只用客户 SessionStateProvider 并删除了自定义的代码 SessionIDManager 方法执行。问题是,我的习惯 会话状态提供程序 习俗 会话管理器 会话启动 事件激发自?看来这和 会话管理器 ,而不是 .

    3 回复  |  直到 15 年前
        1
  •  1
  •   Chris    15 年前

    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;}
        }
    }
    

    全球.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\u start事件。也许您可以尝试使用我的虚拟状态提供程序,看看它是否触发了您的事件。我还假设您的会话启动的签名实际上是正确的(即没有参数或(object,eventargs))。

    不管它值多少,session\u start事件应该在 CreateNewStoreData 方法已在您的提供程序类中运行,因此您可以尝试将断点放在那里,并查看它在该方法之后指向的位置。

        2
  •  1
  •   Chris    15 年前

    编辑: 看来我确实有点没抓住问题的重点。我将把这个答案留在这里,因为它可能会引起一些人的兴趣。如果您认为应该删除,请随时发表评论。

    抱歉,这是一个答案,因为我不是100%确定我说什么,但它太长了,不能作为一个评论。。。

    我不确定您是否创建了自定义会话模块或jsut会话状态存储提供程序。我假设模块,但我不确定从只是“SessionStateProvider”。。。

    据我所知,web.config中添加的任何httpmodule都将经历一个尝试连接到global.asax中事件的过程。它这样做的方式似乎是寻找形式为“{name}{event}”或“{name}{u on{event}”的方法,并将它们连接到 {name}是您在web.config中为模块指定的名称,{event}当然是类中事件的名称(即start)。

    <add name="MySession" type="MySessionStateModule" />
    

    那你就要加入你的global.asax了 MySession_Start

    我希望这有帮助。抱歉,如果它没有和它的所有东西你以前试过。我建议给出一些代码和一些你已经尝试过的东西的想法,尽管失败了。有趣的代码可能是在站点中添加自定义代码(即web.config的适当部分),或者在会话类中添加一些代码(如果可以很容易地将其简化为简单的形式)(例如,只返回常量的会话提供程序可能很短,并显示错误)。另外,一些关于它是否保持会话状态的指示(即它是否与不调用onstart分开工作)也很好。:)

    编辑以添加: 我想我应该把我遇到的一个有用的网页链接起来。 http://aspnetresources.com/articles/event_handlers_in_global_asax 讨论了global.asax中的标准错误处理程序是如何连接起来的,并向我指出了一个有趣的方法hookupeventhandlersforaplicationandmodules,它为我提供了一些关于这些方法如何工作的线索。

        3
  •  0
  •   Wyatt Barnett    15 年前

    我猜操作的目标是做一些事情,比如说初始化会话,而不是需要在session\u OnStart方法中具体地做一些事情。假设是这样,我想你可以做以下几点:

    1) 处理appification.PostAcquireRequestState事件。