本文介绍ASP.NET中的会话。不同类型的Session及其配置。还介绍Web Farm上的会话,Load Balancer和Web Garden场景。我还介绍了实时生产环境中会话行为的细节。希望您能喜欢这篇文章并提供宝贵的建议和反馈。
什么是Session?
Web是无状态的,这意味着每次将页面发布到服务器时都会重新创建网页类的新实例。众所周知,HTTP是一种无状态协议,它不能在页面上保存客户端信息。如果用户插入一些信息并移动到下一页,则该数据将丢失,并且用户将无法检索该信息。我们需要什么?我们需要存储信息。Session提供了一种将信息存储在服务器内存上的功能。它可以支持任何类型的对象与我们自己的自定义对象一起存储。对于每个客户端,会话数据都是分开存储的,这意味着会话数据以每个客户端为基础进行存储。看看下面的图表:
使用会话的状态管理是最好的ASP.NET功能之一,因为它是安全的,对用户是透明的,我们可以在其中存储任何类型的对象。除了这些优点之外,有时会话会在高流量站点中导致性能问题,因为它存储在服务器内存中,客户端从服务器读取数据。现在让我们看看在我们的Web应用程序中使用会话的优点和缺点。
Session的优缺点?
以下是使用会话的基本优点和缺点。在稍后的时间点,我详细描述了每种类型的会话。
优点:
- 它有助于在整个应用程序中维护用户状态和数据。
- 这很容易实现,我们可以存储任何类型的对象。
- 分开存储客户数据。
- 会话对用户来说是安全且透明的。
缺点:
- 由于会话数据存储在服务器内存中,所以在大量数据/用户的情况下会导致性能开销。
- 架空参与序列化和反序列化会话数据,因为在的情况下,
StateServer
与SQLServer
会话模式,我们需要将它们存储之前,序列化对象。
除此之外,基于会话类型的会话还有很多优点和缺点。我在下面的相应部分讨论了所有这些问题。
会话模式和状态提供程序
在ASP.NET中,有以下会话模式可用:
- InProc
- StateServer
- SQLServer
对于每个会话状态,都有一个会话提供程序。下图将告诉你他们是如何相关的:
InProc会话模式
这是ASP.NET中的默认会话模式。它将会话信息存储在当前的应用程序域中。这是Web应用程序性能的最佳会话模式。但主要缺点是,如果我们重新启动服务器,它将丢失数据。InProc会话模式还有一些优点和缺点。我稍后会谈到这些问题。
InProc会话模式概述
正如我已经讨论过的,在InProc模式下,会话数据将存储在当前应用程序域中。所以它很容易和快速可用。
InProc会话模式将其会话数据存储在应用程序域上的内存对象中。这由应用程序池中的工作进程处理。所以如果我们重新启动服务器,我们将丢失会话数据。如果客户端请求数据,则状态提供者从内存中的对象读取数据并将其返回给客户端。
在web.config中,我们必须提及会话模式并设置超时。
什么时候应该使用InProc会话模式?
InProc是默认的会话模式。它对于一个小型网站以及用户数量非常少的情况可能非常有帮助。我们应该避免在Web Garden中使用InProc(稍后我会谈到这个话题)。
优点:
- 它将会话数据存储在当前应用程序域的内存对象中。所以访问数据非常快,数据很容易获得。
- 不需要序列化来将数据存储在InProc会话模式中。
- 实现非常简单,类似于使用ViewState。
缺点:
尽管InProc会话是最快,最常见和默认的机制,但它有很多限制:
- 如果工作进程或应用程序域被回收,则所有会话数据都将丢失。
- 虽然它是最快的,更多的会话数据和更多的用户可以影响性能,因为内存使用情况。
- 我们不能在网络场景中使用它。
- 此会话模式不适用于Web场景。
根据以上讨论,我们可以得出结论:InProc是一个非常快速的会话存储机制,但仅适用于小型Web应用程序。如果我们重新启动服务器,或者应用程序域被回收,则InProc会话数据将会丢失。
它也不适用于Web Farm和Web Garden场景。
StateServer会话模式概述
这也被称为Out-Proc会话模式。StateServer使用独立于IIS的独立Windows服务,也可以在单独的服务器上运行。此会话状态完全由aspnet_state.exe管理。该服务器可能运行在同一个系统上,但它不在运行Web应用程序的主应用程序域。这意味着如果你重新启动你的ASP.NET进程,你的会话数据将仍然存在。由于涉及序列化和反序列化的开销,这种方法有几个缺点,它也增加了数据访问的成本,因为每次用户检索会话数据时,我们的应用程序都会遇到不同的进程。
StateServer会话模式的配置
在StateServer模式下,会话数据存储在独立于IIS的独立服务器中,并由aspnet_state.exe处理。此过程作为Windows服务运行。您可以从Windows MMC或命令提示符启动该服务。
现在查看StateServer设置的web.config配置。对于StateServer设置,我们需要指定stateConnectionString
。这将识别运行状态服务器的系统。默认情况下,stateConnectionString
使用IP 127.0.0.1(本地主机)和端口42424。
当我们使用StateServer时,我们可以配置stateNetworkTimeOut
属性来指定在取消请求之前等待服务响应的最大秒数。默认的超时值是10秒
为了使用StateServer,我们要存储的对象应该被序列化,并且在检索时,我们需要将它反序列化。我用一个例子来描述下面的内容。
StateServer会话模式如何工作
我们使用StateServer会话模式来避免重新启动Web服务器时不必要的会话数据丢失。StateServer由aspnet_state.exe进程维护为Windows服务。这个过程维护所有会话数据。但是我们需要在将数据存储到StateServer会话模式之前序列化数据。
如上图所示,当客户端向Web服务器发送请求时,Web服务器将会话数据存储在状态服务器上。StateServer可能是当前的系统或不同的系统。但它将完全独立于IIS。StateServer的目标将取决于web.configstateConnectionString
设置。如果我们将其设置为127.0.0.1:42424,它会将数据存储在本地系统中。要更改StateServer目标,我们需要更改IP,并确保aspnet_state.exe已启动并在该系统上运行。
优点:
- 它使数据与IIS分开,所以IIS的任何问题都不会妨碍会话数据。
- 它在网络农场和网络花园场景中很有用。
缺点:
- 由于序列化和反序列化,进程缓慢。
- 状态服务器始终需要启动并运行。
SQLServer会话模式
这种会话模式为我们提供了更安全可靠的ASP.NET会话管理。在此会话模式中,会话数据被序列化并存储在SQL Server数据库中。这种会话存储方法的主要缺点是与数据序列化和反序列化相关的开销。这是在网络农场中使用的最佳选择。
要设置SQL Server,我们需要这些SQL脚本:
- 用于安装:InstallSqlState.sql
- 要卸载:UninstallSQLState.sql
配置SQL Server的最简单方法是使用aspnet_regsql命令。
我已经详细解释了在配置部分使用这些文件的情况。这是Web场景中最有用的状态管理。
什么时候应该使用SQLServer会话模式?
- SQL Server会话模式是一种更可靠和安全的会话状态管理。
- 它将数据保存在一个集中的位置(数据库)。
- 当我们需要实现更安全的会话时,我们应该使用SQLServer会话模式。
- 如果出现频繁的服务器重启,这是一个理想的选择。
- 这是网络农场和网络花园场景的完美模式(我在后面详细解释了这一点)。
- 当我们需要在两个不同的应用程序之间共享会话时,我们可以使用SQLServer会话模式。
SQLServer会话模式的配置
在SQLServer会话模式中,我们将会话数据存储在SQL Server中,因此我们需要首先在web.config中提供数据库连接字符串。该sqlConnectionString
属性用于此。
在我们设置连接字符串之后,我们需要配置SQL Server。现在我将解释如何使用aspnet_regsql命令来配置您的SQL Server 。
步骤1:从命令提示符处,转到您的Framework版本目录。例如:c: windows microsoft.net framework <版本>。
步骤2:使用以下参数运行aspnet_regsql命令:
看看参数及其用途:
参数 | 描述 |
---|---|
-ssadd | 添加对SQLServer模式会话状态的支持。 |
-sstype p | P代表坚持。它会将会话数据保留在服务器上。 |
-S | 服务器名称。 |
-U | 用户名。 |
-P | 密码。 |
第3步:打开SQL Server Management Studio,检查是否创建了新的数据库ASPState,并且应该有两个表:
- ASPStateTempApplications
- ASPStateTempSessions
优点和缺点
优点:
- 如果我们重新启动IIS,会话数据不受影响
- 最可靠和最安全的会话管理。
- 它使数据位于中央,很容易从其他应用程序访问。
- 在网络农场和网络场景中非常有用。
缺点:
- 处理本质上非常缓慢。
- 对象序列化和反序列化为应用程序创建开销。
- 由于会话数据是在不同的服务器中处理的,我们必须关心SQL Server。它应该始终保持正常运行。
生产部署概述
生产环境是我们在现场生产服务器上部署应用程序的地方。Web开发人员将他们的应用程序部署到实时服务器上是一项重大和巨大的挑战,因为在大型生产环境中,有大量用户,并且很难用单台服务器处理这么多用户的负载。这里有Web Farm,Load Balancer,Web Garden等概念。下图显示了生产环境的总体图:
应用程序池
这是您应该在生产环境中为应用程序创建的最重要的事情之一。应用程序池用于分隔共享相同配置的IIS工作进程集。应用程序池使我们能够隔离我们的Web应用程序,以提高安全性,可靠性和可用性。
工作进程充当分离每个应用程序池的进程边界,以便当一个工作进程或应用程序出现问题或被回收时,其他应用程序或工作进程不受影响。
网上花园-Web Garden
默认情况下,每个应用程序池都使用单个工作进程(W3Wp.exe)运行。我们可以使用单个应用程序池分配多个工作进程。具有多个工作进程的应用程序池称为Web Garden。许多具有相同应用程序池的工作进程有时可以提供更好的吞吐性能和应用程序响应时间 每个工作进程都应该有自己的线程和内存空间。
如图所示,在IIS中,可能有多个应用程序池,每个应用程序池至少有一个工作进程。Web Garden应该包含多个工作进程。
在Web应用程序中使用Web Garden有一定的限制。如果我们使用InProc会话模式,我们的应用程序将无法正常工作,因为会话将由不同的工作进程处理。为了避免这个问题,我们应该使用OutProc会话模式,我们可以使用会话状态服务器或SQL-Server会话状态。
主要优点:
Web Garden中的工作进程共享针对特定应用程序池的请求。如果工作进程失败,另一个工作进程可以继续处理请求。
Session如何依赖Web Garden?
我已经解释过InProc是由一个工作进程处理的。它将数据保存在其内存对象中。现在,如果我们有多个工作进程,那么处理会话将非常困难,因为每个工作进程都有自己的内存,所以如果我的第一个请求转到WP1,并且它保留我的会话数据,并且第二个请求转到WP2 ,我试图检索会话数据,它将不可用,这将引发错误。所以请在InProc会话模式下避免使用Web Gardens。
我们可以在Web Gardens中使用StateServer或SQLServer会话模式,因为如前所述,这两种会话模式不依赖于工作进程。在我的例子中,我也解释了如果你重新启动IIS,你仍然可以访问你的会话数据。
处理Web Farm和负载均衡器场景中的会话
InProc:在InProc会话模式中,会话数据存储在工作进程的内存中对象中。每个服务器都有自己的工作进程,并将会话数据保存在内存中。
如果一台服务器关闭,并且请求转到另一台服务器,则用户无法获取会话数据。所以不建议在Web Farms中使用InProc。
StateServer:我已经解释了状态服务器是什么以及如何配置状态服务器等等。对于Web场景,您可以轻松了解这一点的重要性,因为所有会话数据都将存储在一个位置。
请记住,在网络农场中,您必须确保您的<machinekey>
所有Web服务器都具有相同的功能。其他内容与我之前描述的相同。所有web.config文件将具有相同的配置(stateConnectionString)
对于会话状态。
SQL Server:这是另一种方法,我们可以在Web场中使用它。我们需要首先配置数据库。所要求的步骤已经被解释了。
如上图所示,所有Web服务器会话数据将存储在单个SQL Server数据库中。它很容易访问。记住一点,你应该在StateServer和SQLServer模式下序列化对象。如果其中一个Web服务器出现故障,负载均衡器会将负载分配给其他服务器,并且用户仍然可以从服务器读取会话数据,因为数据存储在中央数据库服务器中。
总之,我们可以在Web场中使用StateServer或SQLServer会话模式。我们应该避免InProc。