25

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

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

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

4

3 回答 3

33

在什么方面更好?

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

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

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

无 Cookie 会话

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

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

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

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

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

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

会话超时

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

于 2011-12-31T12:22:45.677 回答
15

您可以通过 3 种方式使用 Session。每个都有优点和缺点

进程内:

  • Inproc 会话更快。
  • 您可以添加没有序列化的对象
  • 但仅限于一台服务器,如果您的应用程序将在多台服务器上运行。这对你不起作用
  • 如果应用程序池发生某些事情,您将丢失所有会话信息

会话状态:

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

Sql 服务器:

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

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

于 2011-12-31T12:33:42.743 回答
2

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 中。

于 2016-07-16T08:51:45.707 回答