如果定义了 Session_Start,ASP.NET 如何知道创建 ASP.NET_SessionId cookie?

Posted

技术标签:

【中文标题】如果定义了 Session_Start,ASP.NET 如何知道创建 ASP.NET_SessionId cookie?【英文标题】:How does ASP.NET know to create the ASP.NET_SessionId cookie if Session_Start is defined? 【发布时间】:2015-10-14 07:05:13 【问题描述】:

我已经对此进行了很多测试,但我完全感到困惑。如果定义了MvcApplication 类中的Session_Start 方法,即使我没有在任何地方使用Session 变量,ASP.NET 似乎也会生成一个ASP.NET_SessionId cookie。这似乎很奇怪,考虑到方法的主体中不必有任何东西。

示例(Global.asax.cs):

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MyApplication

    public class MvcApplication : System.Web.HttpApplication
    
        protected void Application_Start()
        
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        

        private void Session_Start()   // this is all it takes to generate a SessionId (?)
    

现在,我很困惑,原因有很多:

    Session_Start 函数的存在如何足以生成 SessionId?我没有在应用程序的任何地方使用Session 变量,并且该方法为空。

    Session_Start 方法是私有的,我显然不会在类中的任何地方调用它,那么 ASP.NET 是如何知道会话何时开始的呢?

    这个类之外的东西怎么知道Session_Start方法的存在,并检查SessionId cookie?它不是一个局部类,它被明确标记为private

我知道这些原因会相互混合,但我真的不知道这是如何工作的。

【问题讨论】:

这有帮助吗? ***.com/questions/25445912/… 或msdn.microsoft.com/en-us/library/ms178473.aspx 我并不总是将Session_Start 放在我的应用程序类中,而且我仍然得到 SessionID。我认为您寻求的答案在别处。 @mason - 我只在定义该方法时获得 SessionIds。如果我将其注释掉,我将不再获得 SessionId cookie,所以它肯定是 Session_Start @johnnyRose 如果您将其注释掉,但在某些 Web 表单或控制器上使用 Session 对象怎么办? 【参考方案1】:

Session_Start 就像应用程序的事件处理程序。创建新会话时,应用程序会调用此方法。它不会创建会话 ID,它旨在让开发人员知道用户何时首次访问该站点(该会话)。这可用于运行一些初始化例程或跟踪目的(例如,我们今天有 x 个唯一会话)。

触发创建 Session 和 SessionID 的是用户访问启用了会话的页面 - ASP.NET 将在幕后创建会话。这个问题的答案有两种启用页面会话状态的方法:Session state can only be used when enableSessionState is set to true either in a configuration

总结:

在 web.config 中,对于所有页面:

<system.web>
      <pages enableSessionState="true" /> 
 </system.web>

在您的 page.aspx 中,以每页为基础(将其设置为 false 以在每页基础上关闭它):

<%@Page enableSessionState="true"> 

您的 web.config 还应该配置 SessionState 模式。这是一个使用服务器内存来存储会话状态的示例:

<sessionState cookieless="false" mode="InProc" timeout="20" />

【讨论】:

感谢您的(非常好的)回答。我知道Session_Start 方法实际上并没有创建 SessionIds,但我想我仍然对私有方法的存在如何告诉 ASP.NET 生成这些 Ids 感到困惑。这有意义吗? 它没有。如果删除该方法会发生什么?我不认为必须实现任何应用程序事件。 我没有在我的应用程序的任何其他地方使用会话变量,所以当我删除它时,不再创建 SessionIds - 当你说它时这是有道理的。我只是不明白如何 嗯,所以也许这只是另一个触发器。如果您在所有页面上禁用会话状态,Session_Start 方法仍然会被命中吗?在上面的例子中,在 web.config 中设置 &lt;pages enableSessionState="false" /&gt; 看看会发生什么。 相同行为 - 定义 Session_Start 时创建 SessionId cookie。

以上是关于如果定义了 Session_Start,ASP.NET 如何知道创建 ASP.NET_SessionId cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何从本地的 PHP session_start() 检查不同的变量? [复制]

PHP会话控制之session_start

A session had already been started – ignoring session_start() 怎么办?

“未定义变量:_SESSION”VS。 “会话已经开始”

PHP:会话变量

session与PHP之session_start()