ASP.NET 세션 사용에 대한 자세한 설명

高洛峰
풀어 주다: 2017-01-07 09:49:27
원래의
2668명이 탐색했습니다.

세션 모델 소개

세션이란? 쉽게 말하면 서버가 클라이언트에게 부여하는 숫자이다. WWW 서버가 실행 중일 때 이 서버에서 실행되는 웹 사이트를 탐색하는 여러 사용자가 있을 수 있습니다. 각 사용자가 처음으로 이 WWW 서버에 연결을 설정할 때 이 서버와 세션을 설정하고 서버는 사용자의 고유 ID를 식별하기 위해 자동으로 SessionID를 할당합니다. 이 SessionID는 WWW 서버에 의해 무작위로 생성된 24자 문자열입니다. 다음 실험에서 실제로 어떻게 보이는지 살펴보겠습니다.

이 고유한 SessionID는 실용적인 의미가 매우 큽니다. 사용자가 양식을 제출하면 브라우저는 자동으로 사용자의 SessionID를 HTTP 헤더 정보에 추가합니다. 이는 브라우저의 자동 기능이며 사용자는 이를 알지 못합니다. 서버가 양식 처리를 완료하면 결과는 SessionID에 해당하는 사용자에게 표시됩니다. SessionID가 없다면 두 명의 사용자가 동시에 등록할 때 서버는 어떤 사용자가 어떤 양식을 제출했는지 어떻게 알 수 있습니까? 물론 SessionID에는 나중에 언급할 다른 많은 기능이 있습니다.

SessionID 외에도 각 세션에는 기타 많은 정보가 포함되어 있습니다. 그러나 ASP 또는 ASP.NET 프로그램을 작성하는 사람들에게 가장 유용한 것은 ASP/ASP.NET의 내장 Session 개체에 액세스하여 각 사용자에 대한 자신의 정보를 저장하는 것입니다. 예를 들어, 우리 웹사이트를 방문하는 사용자가 탐색한 페이지 수를 알고 싶습니다. 사용자가 방문할 수 있는 각 페이지에 다음을 추가할 수 있습니다.

<%
If Session("PageViewed") = ""Then
 Session("PageViewed") = 1
Else
 Session("PageViewed") = Session("PageViewed") + 1
End If
%>
로그인 후 복사

다음 문장을 통해 사용자는 몇 가지 탐색을 수행했는지 알 수 있습니다. 페이지:

<%
Response.Write("You have viewed " & Session("PageViewed") & " pages")
%>
로그인 후 복사

일부 독자는 다음과 같이 질문할 수 있습니다. 배열처럼 보이는 이 세션("..")은 어디서 오는 걸까요? 제가 정의해야 하나요? 실제로 이 Session 객체는 ASP 해석 기능을 갖춘 WWW 서버의 내장 객체입니다. 즉, 이 개체는 ASP 시스템에서 정의되었으므로 이를 사용하기만 하면 됩니다. Session(“..”)의 ..는 변수 이름과 같고 $$$ in Session(“..”)=$$$은 변수의 값입니다. 문장 하나만 작성하면 이 사용자의 모든 페이지에서 변수의 값에 액세스할 수 있습니다.

실제로 ASP에는 Session, Application, Cookie, Response, Request, Server 등 총 7개의 객체가 내장되어 있습니다. JSP, PHP 등 다른 서버사이드 스크립팅 언어에도 유사한 객체가 있지만 이름이나 사용 방법이 다릅니다.

ASP Session 기능 결함

현재 ASP 개발자들은 Session의 강력한 기능을 사용하고 있는데, 사용 중에 ASP Session에 다음과 같은 결함이 있다는 것을 발견했습니다.

프로세스 종속성: ASP 세션 상태는 inetinfo.exe 프로그램인 IIS 프로세스에 저장됩니다. 따라서 inetinfo.exe 프로세스가 충돌하면 이 정보가 손실됩니다. 또한 IIS 서비스를 다시 시작하거나 닫으면 정보가 손실됩니다.

세션 상태 사용 범위 제한: 사용자가 한 웹 사이트에서 다른 웹 사이트를 방문하는 경우 세션 정보가 함께 전송되지 않습니다. 예: Sina 웹사이트에는 하나 이상의 WWW 서버가 있을 수 있습니다. 사용자가 로그인한 후 다양한 채널을 검색해야 하지만 각 채널은 다른 서버에 있습니다. 이러한 WWW 서버에서 세션 정보를 공유하려면 어떻게 해야 합니까?

쿠키 의존성: 실제로 클라이언트의 세션 정보는 쿠키에 저장됩니다. 클라이언트가 쿠키 기능을 완전히 비활성화하면 세션에서 제공하는 기능을 사용할 수 없습니다.

위의 ASP 세션 결함을 고려하여 Microsoft 디자이너는 ASP.NET 세션을 설계 및 개발할 때 이에 상응하는 개선을 이루어 위의 결함을 완전히 극복하여 ASP.NET 세션을 더욱 강력한 기능으로 만들었습니다.

Web.config 파일 소개

일부 ASP.NET 프로그래머는 다음과 같이 말했습니다. Web.config 파일? 들어본 적도 없는데 제가 작성한 프로그램도 정상적으로 돌아가지 않나요? 예, 맞습니다. 프로그램은 Web.config 파일 없이도 정상적으로 실행될 수 있습니다. 그러나 대규모 웹사이트를 구축하고 전체 웹사이트 페이지를 어떤 언어로 작성하는지, 웹사이트의 보안 인증 모드, 세션 정보 저장 방법 등 전체 웹사이트에 대한 전반적인 구성을 해야 하는 경우에는 다음과 같은 작업이 필요합니다. Web.config 파일을 사용하십시오. Web.config 파일의 일부 옵션은 IIS를 통해 구성할 수 있지만 Web.config에 해당 설정이 있으면 IIS의 구성을 덮어씁니다. 또한 Web.config 파일의 가장 큰 장점은 System.web 네임스페이스를 호출하여 ASP.NET 페이지에서 Web.config의 설정에 액세스할 수 있다는 것입니다.

Web.config에는 서버 구성 파일과 웹 애플리케이션 구성 파일이라는 두 가지 유형이 있습니다. 둘 다 Web.config라는 이름을 갖습니다. 이 구성 파일에는 현재 IIS 서버의 웹 페이지가 어떤 언어로 작성되었는지, 애플리케이션 보안 인증 모드, 세션 정보 저장 방법 등 일련의 정보가 저장됩니다. 이 정보는 XML 구문을 사용하여 저장됩니다. 편집하려면 텍스트 편집기를 사용하세요.

其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NET Framework 1.0中,服务器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。

而Web应用程序配置文件Web.config则保存在各个Web应用程序中。例如:当前网站的根目录\Inetpub\wwwroot,而当前的Web应用程序为MyApplication,则Web应用程序根目录就应为:\Inetpub\wwwroot\MyApplication。如果你的网站有且只有一个Web应用程序,一般说来应用程序的根目录就是\Inetpub\wwwroot。如果想添加一个Web应用程序,在IIS中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是,这样通过IIS添加Web应用程序是不会为你生成Web.config文件的。如果想创建一个带有Web.config文件的Web应用程序,需要使用Visual Studio.NET,新建一个Web应用程序项目。

Web应用程序的配置文件Web.config是可选的,可有可无。如果没有,每个Web应用程序会使用服务器的Web.config配置文件。如果有,则会覆盖服务器Web.config配置文件中相应的值。

在ASP.NET中,Web.config修改保存后会自动立刻成效,不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。

Web.config文件中的Session配置信息

打开某个应用程序的配置文件Web.config后,我们会发现以下这段:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>
로그인 후 복사
로그인 후 복사
로그인 후 복사

这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的:

<sessionState mode="Off|InProc|StateServer|SQLServer"
       cookieless="true|false"
       timeout="number of minutes"
       stateConnectionString="tcpip=server:port"
       sqlConnectionString="sql connection string"
       stateNetworkTimeout="number of seconds"
/>
로그인 후 복사

必须有的属性是

ASP.NET Session使用详解

可选的属性是:

ASP.NET Session使用详解

ASP.NET中客户端Session状态的存储

在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。

ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:

找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>
로그인 후 복사
로그인 후 복사
로그인 후 복사

这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。关闭当前的IE,打开一个新IE,重新访问刚才的Web应用程序,就会看到类似下面的样子:

其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的Session ID。注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。

ASP.NET中服务器端Session状态的存储

准备工作

为了您能更好的体验到实验现象,您可以建立一个叫做SessionState.aspx的页面,然后把以下这些代码添加到中。

<scriptrunat="server">
Sub Session_Add(sender As Object, e As EventArgs)
   Session("MySession") = text1.Value
   span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" & \
            Session("MySession").ToString() & "</font>"
End Sub

Sub CheckSession(sender As Object, eAs EventArgs)
   If (Session("MySession")Is Nothing) Then
    span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
   Else
    span1.InnerHtml = "Your session contains: <font color=red>" & \
             Session("MySession").ToString() & "</font>"
End If
End Sub
</script>
<formrunat="server"id="Form2">
   <inputid="text1"type="text"runat="server"name="text1">
   <inputtype="submit"runat="server"OnServerClick="Session_Add"
      value="Add to Session State" id="Submit1"name="Submit1">
   <inputtype="submit"runat="server"OnServerClick="CheckSession"
      value="View Session State" id="Submit2"name="Submit2">
</form>
<hrsize="1">
<fontsize="6"><spanid="span1"runat="server" /></font>
로그인 후 복사

这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。

将服务器Session信息存储在进程中

让我们来回到Web.config文件的刚才那段段落中:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20" 
/>
로그인 후 복사
로그인 후 복사
로그인 후 복사

当mode的值是InProc时,说明服务器正在使用这种模式。

这种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。

好了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。(想当初使用NT4时,重新启动IIS必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已经丢失了。

将服务器Session信息存储在进程外

首先,让我们来打开管理工具->服务,找到名为:ASP.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。

然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。

实际上,这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=192.168.0.2:42424"。当然,不要忘记在192.168.0.2的计算机中装上.NET Framework,并且启动ASP.NET State Services服务。

将服务器Session信息存储在SQL Server中

首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:

[system drive]\winnt\Microsoft.NET\Framework\[version]\
로그인 후 복사

然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。

接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:sqlConnectionString="data source=localhost; Integrated Security=SSPI;",其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。


更多ASP.NET Session使用详解相关文章请关注PHP中文网!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿