繁体   English   中英

如果定义了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类中的Session_Start方法,ASP.NET似乎会生成一个ASP.NET_SessionId 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 (?)
    }
}

现在,我因为多种原因感到困惑:

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

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

  3. 本类之外的任何内容如何知道Session_Start方法是否存在,以及检查SessionId cookie? 它不是部分类,它明确标记为private

我知道这些原因有点融合​​在一起,但我真的不知道它是如何运作的。

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

触发创建Session和SessionID的是用户访问已启用会话的页面 - ASP.NET将在后台创建Session。 此问题的答案有两种启用页面会话状态的方法:只有在配置中将enableSessionState设置为true时才能使用会话状态

综上所述:

在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" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM