编程语言
首页 > 编程语言> > c#-如果定义了Session_Start,ASP.NET如何知道创建ASP.NET_SessionId cookie?

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

作者:互联网

我已经对此进行了大量测试,但我感到非常困惑.如果定义了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?它不是局部类,并且已明确标记为私有.

我知道这些原因相互融合在一起,但是我对此确实感到茫然.

解决方法:

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

触发创建Session和SessionID的原因是用户访问启用了会话的页面,ASP.NET将在后台创建Session.该问题的答案有两种启用页面会话状态的方法: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-cookies,session,c,asp-net-mvc
来源: https://codeday.me/bug/20191120/2040293.html