对于 asp.net 中的会话状态模式,InProc 或 SQL Server 哪个更好?

Posted

技术标签:

【中文标题】对于 asp.net 中的会话状态模式,InProc 或 SQL Server 哪个更好?【英文标题】:Which one is better, InProc or SQL Server, for Session State mode in asp.net? 【发布时间】:2012-01-31 01:30:48 【问题描述】:

我正在开发一个 ASP.NET 网站。我想知道在会话状态模式下哪个更好:InProc 还是 SQL Server?我需要听听您在这个问题上的经验。

另一个问题是关于 cookieless 属性的。如果我将其设置为 true,我的网站是否存在安全漏洞?在我在 MSDN 网站上看到的所有示例中,此属性都设置为 false。

最后一个问题是关于 Timeout 属性的。当我将其设置为 InProc 模式时,此属性是否会影响我的会话生命周期?

【问题讨论】:

【参考方案1】:

在什么方面更好?

InProc 会话要快得多,要求更少(序列化),但是当您在多个 Web 服务器上运行应用程序时无法使用;

Sql session慢得多,有对象序列化要求,但可以在多个Web服务器之间共享;

这是开发人员最应该关心的主要区别。

无 Cookie 会话

您应该就此提出一个单独的问题,因为它与上一个问题完全无关。

如果您关闭 cookie 会话 ID 处理,您将能够看到会话 ID。但是,如果您检查 cookie,您也可以。号码就在那里。

会话 cookie 过期设置为浏览器会话,因此在持久性方面几乎相同。

如果您知道其他方的会话 ID,会话可能会被劫持。如果您使用无 cookie 会话当然会更容易,因为您所要做的就是更改 URL...

还有另一件事是复制 URL 和共享/保存(收藏夹)。我想我不必解释这个问题。

默认情况下,无 Cookie 会话为 false,因为绝大多数浏览器都支持 cookie。 只有在您知道您的客户不会有 cookie 时才应该打开它。

会话超时

无论会话类型如何,会话超时始终与会话到期有关。但是您必须注意,当您使用 SQL Express 版本时,SQL 会话状态可能不遵守此设置,因为您需要 SQL Server 代理服务来丢弃过期的会话。您可以通过编写自己的丢弃过期会话的 Windows 服务来缓解此问题。

【讨论】:

,我再次为此道歉。所以因为我把我的网站上传到服务器上,最好使用 InProc 模式,我对吗?但是你对我最后一个问题 Robert 的想法是什么? 使用 InProc 会话状态是的,单个 Web 服务器要好得多。这是默认配置,因此您不必显式设置任何内容。之后我也回答了你的最后一个问题。 是的,谢谢罗伯特。再次对我的问题感到抱歉,非常感谢您的出色回答。您的回答现在已被接受。祝您好运 @AliForoughi:谢谢。很高兴我能帮上忙。 当我们有一个服务器场时,通常会有一个初始服务器确保用户从同一台机器上获得服务,通常称为“粘性会话”或“亲和力”。如果在大多数情况下都可以使用 InProc,不利的一面是,如果他们使用的服务器出现故障或停止使用,您的用户将失去他们的会话。【参考方案2】:

您可以通过 3 种方式使用 Session。各有优缺点

进程内:

Inproc 会话更快。 无需序列化即可添加对象 但仅限于一台服务器,如果您的应用程序将在超过 一台服务器。这对你不起作用 如果应用程序池发生问题,您将丢失所有会话信息

会话状态:

将作为 Windows 服务运行 如果您的应用将跨多个服务器运行,这将有所帮助 添加到 Session 的对象需要序列化

Sql 服务器:

使用 sql server,但也有 Oracle 实现 比状态服务器慢 更可靠

也看看这个问题: SQLServer vs StateServer for ASP.NET Session State Performance

【讨论】:

如果您的服务器场在路由器的网络配置中启用了“服务器关联”,则 In-Proc 不限于一台服务器设置。这意味着当您连接到该站点时,您将在每次请求时都绑定到该服务器。【参考方案3】:

InProc 会话状态

InProc 会话模式表示会话状态存储在本地,意味着使用 InProc 会话状态模式是 将对象存储在 Web 应用程序的 AppDomain 中。因此,当 IIS(Internet 信息系统)重新启动时,会话状态会丢失。 通常,AppDomain 会根据 memoryLimit 属性等几个因素重新启动 配置文件部分的设置,修改 Global.asax 或 Web.config 文件等。

我们可以使用 StateServer 或 SqlServer 会话状态模式来克服这些问题,这里会话状态不存储在 Web 应用程序的 AppDomain 中。

OutProc 会话状态

在 OutProc Session 中,Sessin 状态存储在 StateServer 和 SqlServer 模式中,不在 Web 应用的 AppDomain 中。

StateServer:它使用独立的 Microsoft Windows 服务来存储会话变量,所以这个服务 独立于IIS,它可以在单独的服务器上运行。 您可以将此模式用于负载平衡解决方案,因为多个 Web 服务器可以共享会话变量。 尽管重新启动 IIS 不会丢失会话变量,但跨进程边界时性能会受到影响。

SqlServer: SqlServer 模式还使您能够利用位于 IIS 进程之外的状态存储,并且可以 位于本地计算机或远程服务器上。对于会话信息的持久化,可以使用SqlServer模式 SqlServer 模式类似于进程外模式,不同之处在于会话数据保存在 SQL Server 中。

【讨论】:

以上是关于对于 asp.net 中的会话状态模式,InProc 或 SQL Server 哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

使用 protobuf-net 的 ASP.NET SessionState 模式 SQLServer 序列化

无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

对于同一 IIS 服务器 ASP.NET 上的 2 个应用程序,会话丢失太快

非锁定进程内 ASP.NET 会话状态存储

在 Ajax 调用期间保持 ASP.Net 会话处于活动状态

ASP.Net 会话状态提供程序故障转移方案