如果定义了 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 (?)
}
}
现在,我很困惑,原因有很多:
仅存在 Session_Start
函数如何足以生成 SessionId?我没有在应用程序的任何地方使用 Session
变量,并且该方法是空的。
Session_Start
方法是私有的,我显然不会在 class 中的任何地方调用它,所以 ASP.NET 如何知道会话何时开始?
这个 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" />
我对此做了很多测试,但我很困惑。如果定义了 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 (?)
}
}
现在,我很困惑,原因有很多:
仅存在
Session_Start
函数如何足以生成 SessionId?我没有在应用程序的任何地方使用Session
变量,并且该方法是空的。Session_Start
方法是私有的,我显然不会在 class 中的任何地方调用它,所以 ASP.NET 如何知道会话何时开始?这个 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" />