如果定义了 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?

我对此做了很多测试,但我很困惑。如果定义了 MvcApplication class 中的 Session_Start 方法,似乎 ASP.NET 将生成一个 ASP.NET_SessionId cookie,即使我没有使用 [=17] =] 变量在任何地方。这看起来很奇怪,考虑到方法的主体中不需要任何东西。

示例 (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 (?)
    }
}

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

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

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

  3. 这个 class 之外的任何东西如何知道 Session_Start 方法存在,并检查 SessionId cookie?它不是部分 class,并且明确标记为 private

我知道这些原因有点相互融合,但我真的不知道这是怎么回事。

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

触发会话和 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" />