会话状态和应用程序池

时间:2011-02-15 21:13:33

标签: .net session-state

我有一个网络服务器,我的团队已将Web应用程序的应用程序池设置为3以获得静音和性能。但是,我们偶然发现了部分应用程序无法完全运行的问题。

我们认为问题在于应用程序的这一部分使用会话,并且我们认为当数据被回发时它不会链接回正确的工作进程。

但是,我不确定这一点,或者我是否应该在web.config中使用SessionState。如果我是对的,模式应该是InProc,SessionState还是其他什么?会话应该超时吗?

有人可以告诉我吗?

2 个答案:

答案 0 :(得分:1)

您不能以多线程方式使用InProc(应用程序池中的3个线程),而不保证每个请求都转到同一个线程。

InProc字面意思是在进程中,就像在当前线程的内存中一样。

如果您转移到另一个存储方法,例如,移动到数据库,则可以在给定应用程序的所有实例之间共享会话。

我建议阅读this

答案 1 :(得分:0)

因此,您已将应用程序分解为同一服务器上的三个部分,每个部分都在IIS中自己的应用程序池下运行?我会挑战这样做的假设,但这不是你的问题。

我认为你不能这样做,并使用开箱即用的工具分享会话状态。它使用站点(配置数据库)路径作为会话状态“密钥”的一部分,因此来自不同站点的会话不会发生冲突。

但是如果你能做到这一点,你需要使用一个进程外sessionState模式(StateServer或SQLServer)。

我没有尝试过以下内容,但他们可以帮助您。

以下是Code Project article的链接,其中介绍了如何修改SQL Server会话以对网站进行分组和共享会话。

以下是ASP 101 article的链接,其中介绍了与子站点共享会话的一种方法。不确定这是否适用于具有不同应用程序池的情况。

编辑:

啊,一个网络花园。是的,您的工作进程不共享InProc会话数据。您需要使用外部提供程序。 StateServer工作正常。您需要在服务器上启用ASP.NET状态服务并更新web.config以使用它。有一些事情需要考虑:

  • 是否在其他服务器上运行 比IIS?需要启用远程 连接。
  • 你有多个网络吗? 服务器?需要定义一台机器 键。
  • 您是否正在存储对象? 会议?需要标记它们 序列化的。

网上有很多资源可以帮助解决这个问题,这里有一个例子blog post