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

joh*_*ose 5 c# asp.net-mvc session session-cookies

我已经对此进行了相当多的测试,我完全感到困惑。ASP.NET_SessionId如果定义Session_StartMvcApplication类中的方法,ASP.NET 似乎会生成一个cookie ,即使我没有在Session任何地方使用该变量。考虑到方法主体中不需要任何内容​​,这似乎很奇怪。

示例(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 (?)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

ps2*_*oat 5

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

触发 Session 和 SessionID 创建的原因是用户访问启用了会话的页面——ASP.NET 将在幕后创建 Session。这个问题的答案有两种为页面启用会话状态的方法:会话状态只能在配置中将 enableSessionState 设置为 true 时使用

总之:

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

<system.web>
      <pages enableSessionState="true" /> 
 </system.web>
Run Code Online (Sandbox Code Playgroud)

在您的 page.aspx 中,逐页(将其设置为 false 以逐页关闭):

<%@Page enableSessionState="true"> 
Run Code Online (Sandbox Code Playgroud)

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

<sessionState cookieless="false" mode="InProc" timeout="20" />
Run Code Online (Sandbox Code Playgroud)