ASP.Net会话状态

ASP.Net会话状态,asp.net,session,httpapplication,session-state,Asp.net,Session,Httpapplication,Session State,我想知道是否可以根据运行应用程序的域更改ASP.net中用于SessionState的sqlConnectionString 情景;我们有20个站点从一个应用程序运行,所有这些站点都与不同的数据库通信,这取决于它们从哪个域(站点)浏览 浏览www.domain1.com时,应用程序与数据库“db1”对话。另一方面,网站www.domain2.com与数据库“db2”等进行对话,从而选择相关内容并将负载分散到每个数据库,而不是使用一个主数据库来处理站点的所有连接 但是出现了一个问题-对于此设置,我

我想知道是否可以根据运行应用程序的域更改ASP.net中用于SessionState的sqlConnectionString

情景;我们有20个站点从一个应用程序运行,所有这些站点都与不同的数据库通信,这取决于它们从哪个域(站点)浏览

浏览www.domain1.com时,应用程序与数据库“db1”对话。另一方面,网站www.domain2.com与数据库“db2”等进行对话,从而选择相关内容并将负载分散到每个数据库,而不是使用一个主数据库来处理站点的所有连接

但是出现了一个问题-对于此设置,我们对SessionState使用SqlServer模式,因此所有站点的所有用户会话都存储在1 aspstate数据库中,现在,随着站点变得越来越繁忙/站点数量增加,该数据库在处理所有站点的所有会话请求时面临越来越大的压力,并且我们开始遇到一些超时错误,其中与该数据库的连接是瓶颈

我们可以将站点从它们自己的应用程序中分离出来,用相同的代码设置不同的应用程序,但在每个应用程序中,在每个Web.Config中设置不同的会话数据库,从而减轻负载。不过,这项任务将相当耗时,而且从长远来看将导致更多的管理。所以我想知道,在创建会话对象之前,是否可以基于域在代码中修改用于SessionState的sqlConnectionString?我们是否可以从System.Web.HttpApplication继承并使用Application\U AcquisiteRequestState事件来创建所需的HttpSessionState对象设置

希望这是有意义的,有人可以提供一些指导,并向我证明这不是白日梦

干杯,
Steve

您可以实现自定义会话状态提供程序。有关详细信息,请参阅。我从来没有这样做过,但如果运气好的话,您可以包装SqlServer会话状态模块并根据域重定向它

  • 首先,与在web.config中设置相比,“我很想知道,在创建会话对象之前,是否可以在代码中基于域修改SessionState使用的sqlConnectionString”,我看不出有什么优势
  • 其次,我认为您需要更改App_Start中的连接字符串设置,以便所有请求都将使用更改的设置。Application_acquisiteRequestState对此可能太晚了

为什么不将网站拆分为特定的web应用程序,并使用hostheader来区分网站。通过这种方式,您可以轻松配置希望web应用程序使用的会话数据库,因为每个web应用程序都有一个单独的web.config文件。

您可以通过实现并为每个域使用不同的分区,跨不同的数据库对会话进行分区


。(示例按会话ID进行分区,但将其改为按域进行分区则很简单。)

我们有几十个开发站点,它们的数据库连接通过项目的主Web.Config进行处理

有一个单独的配置部分对应于我们内部网上的每个URL(例如)。我们有具有类似命名约定的SQL实例(DEVDB1\SQL1、DEVDB1\SQL2)


根据内部网IIS服务器上配置的URL,应用程序将获取相应的配置。对于测试,我们可以轻松地修改用户、数据库服务器或用于特定站点的单个数据库

您的问题不在于数据库连接的瓶颈,而在于您使用来自所有会话的数据来压倒到数据库的网络连接

默认情况下,Sql Server状态提供程序只需序列化数据并将其发送到数据库。这是非常低效的,需要很长时间才能在快速网络上传输


我们通过使用自定义提供程序解决了这个问题,例如在将会话内容发送到数据库之前压缩会话内容。我们看到的压缩率为80%-90%,压缩时间不到10毫秒。

我认为您遗漏了一个要点—将内容放在同一台服务器上的不同数据库中根本没有帮助—如果瓶颈是sql server—要么是sql空间不足,要么是网络带宽不足。在做任何事情之前,我会试着找出是哪一个