对于 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 个应用程序,会话丢失太快