当每个客户端访问一个网站时,它会创建一个相应的会话,用于保存客户端的状态信息。如果网站负载平衡,会话共享是必要的。IIS有五种存储会话的模式。
一、ASP的会话存储模式。网
1.InProc模式(进程内模式)。是默认设置。
会话状态存储在网络服务器的内存中。
2.状态服务器模式(状态服务器模式)。
会话状态存储在一个名为ASP.Net状态服务的独立进程中。这确保了在Web应用程序重新启动时会话状态得到保留,并使会话状态对网络场中的多个Web服务器可用。
3.SQL Server模式。
会话状态存储在一个SQL Server数据库中。这确保了在Web应用程序重新启动时会话状态得到保留,并使会话状态对网络场中的多个Web服务器可用。
4.自定义模式
此模式允许您指定自定义存储提供程序。
5.关闭模式
此模式禁用会话状态。
其次,使用状态服务器存储会话
如果网站负载平衡,您只能选择2、3和4进行会话存储。我们先介绍StateServer模式,先启动状态服务
然后设置网站的“会话状态”
启用本地状态服务
web.config中将自动生成一个配置文件(如果无法生成,请手动添加)
会话状态模式=" StateServer " state connectionstring=" tcpip=loopback :42424 " time out=" 20 "/但是这里有一个问题。如果每台服务器都如上配置,则每台服务器的会话都存储在该计算机的stateserver中。开始分享还是没有作用。在这里,您需要共享一个状态服务器供其他服务器访问,并在其上存储会话。运行regedit 打开注册表找到HKEY _ local _ machine system current controlset services aspnet _ state Parameters节点将AllowRemoteConnection的键值设置为“1”(1表示允许连接远程计算机,0表示禁止)
您也可以修改状态服务器的端口
接下来,在其他服务器中修改web.config的配置文件(sessionState指向启用了远程访问的状态服务器)
会话状态模式=“stateserver”state connectionstring=“tcpip=10 . 16 . 5 . 30:2222”time out=“20”/使用StateServer作为共享会话存储模式不仅存在安全隐患,而且只要上面的共享StateServer重启服务器,所有会话都会丢失,所以这种会话存储模式并不完美。使用StateServer存储会话更适合单个IIS打开多个进程。
第三,使用SQL服务器存储会话
为了保证安全性,避免因重启服务器而丢失会话,需要使用sql server来存储会话。在ASP.NET 2.0版本之后,微软提供了aspnet_regsql.exe工具来方便地配置会话数据库。该工具位于微软。网络服务器上系统根目录的NETFramework版本号文件夹。
cd C: Windows 微软。NET framework 64 v 4 . 0 . 30319 aspnet _ regsql . exe-ssadd-S type c-d数据库名称-S SQL Server IP -U用户名-P passwordapsnet _ regsql . exe-ssadd-S type c-d ASPState-S 10 . 16 . 5 . 36-U sa-P haha 789
注意:数据库名称为ASPState,SQL Server ip为类似IBM-PCSQLEXPRESS的数据库实例名称(如果数据库不是2005的ip地址,否则连接会失败),用户名为sa(或与sa具有相同权限),Password为sa用户名的密码会话。但是,它会在web应用程序中提示相应的配置。此时,如果您查看SQLServer,您会发现数据库ASPState已添加,但没有表。
在命令行运行以下命令:aspnet _ regsql . exe-ssadd-s type p-s SQL server IP-u用户名-p密码
aspnet _ regsql . exe-ssadd-sstypep-s 10 . 16 . 5 . 36-Usa-PHAha789
此命令会保存此应用程序。此时,您将看到ASPState数据库中还有两个表,因此可以使用ASPStateTempSession保存会话,然后您应该设置网站的“会话状态”
ASPStateTempSessions表中的SessionID由两部分组成:网站生成的24位SessionID和8位AppId。对于不同的站点,AppId和AppName也是不同的。如果Session可以在不同的站点下共享,32位SessionID必须一致。因此,您可以修改存储过程tempgetaid,使其获得的SessionID与AppName无关,并按如下方式修改tempgetaid
修改web.config(在数据库中为ASPState分配一个单独的帐户)
session statemenode=' SqL server ' SqL connectionString=' data source=10 . 16 . 5 . 36;userid=sapassword=haha 789 ' cookieless=' false ' time out=' 20 '/session state,这样sql server就可以存储会话,memcache也可以用来存储会话。
第四,ASP.NET错误,未能验证查看状态MAC
然而,当登录并访问该网站时,它报告了一个错误,“ASP。NET错误,未能验证视图状态MAC”。百度看了一下,大多数人说这些属性是通过在页面或者web.config中添加enableeventvalidation=' false ' enableeviewstatemac=' false ' viewstatencryptionmode=' never '来设置的,但这并不能从根本上解决问题,相反这样做更不安全。你就不能说不用犯错吗?如果你犯了错误,你必须从根本上解决问题。
分析错误原因:
ASP.NET有很多和加密相关的东西,比如ViewState,比如FormsAuthenticationTicket,都是要传输给客户端的,加密可以保证它的安全性。加密需要私钥,但是我们没有指定这个私钥,因为是ASP.NET自动生成的。但是,如果它在网络场或集群中,或者在一些加载了CDN的虚拟主机中,则不可能为每台机器自动生成相同的私钥,因为它涉及多个服务器,这导致该服务器生成的数据无法被该服务器解析。然后出了点问题。怎么办?由于ASP.NET不能在多台服务器上自动随机生成相同的私钥,我们只能自己指定。
机器密钥生成工具,自动生成代码
https://www.fishlee.net/tools/machinekeygenerator
将生成的Machinekey插入web.config:
view class=' list ' wx : for=' { { list } } ' wx : key view class=' item ' view class=' wrap ' { item } }/view view class=' delete ' text delete/text/view/view/view/view机器键的角色:
当ASP.net使用表单身份验证时,对cookie数据进行加密和解密。为了确保这部分数据不会在视图状态数据的加密和解密过程中被篡改。确保这部分数据不会被篡改。当会话(进程外会话)时,验证会话状态标识符。毕竟使用session state的SQLServer实现会话共享是微软的事情,有一定的局限性,只能是sql server。事实上,会话共享可以使用其他数据库,如memcache和redis
动词(verb的缩写)ASP.NET状态数据库常见问题
1.如果SESSION值存储在数据库中,而用户关闭了程序,那么如何清空数据库中的SESSION值呢?
在实际的agent,当创建状态数据库时,一个名为_ job _ deleteeexpiredsessions的作业将被添加到SQL Server代理的作业中。如果打开SQL Server代理服务数据库,则可以通过添加的状态记录的超时字段(表达式)定期删除超时状态数据。
2.如何使用ASPStateTempSessions表中的SessionId字段?
数据库中这个表的SessionID字段的值由SessionID和AppID组成,最后8位是AppID,所以最后8位必须是它们之前的SessionID。例如,存储在数据库中的值是“ekr 30 C3 MW VNC 3145 yrsw 3a 037e5e5a”,最后8位的“037 e5e 5a”是AppID,前面的“ekr30c3mw vnc3145yrsw3a”是可以使用Session获取的字符串。应用程序中的SessionID。
3.如何判断Session何时更新?
会议记录被更新时会同时更新期满和锁定日期本地,过期字段为协调世界时。亦称协道界时时间,如果想通过本地之间进行比较判断还是需要使用锁定日期本地。
4、获得Web.config配置文件节点信息的程序?
''获得Web.config文件配置实例
将配置调暗为系统。配置。配置=系统网络。配置。webconfigurationmanager。openwebconfiguration(' ~/web。配置“)”获得状态配置节点实例
将毫秒测试部分调暗为系统网络。配置。sessionstatesection=CType(配置. GetSection('系统。网络/会话状态'),系统.网络。配置。会话状态部分)' '获得状态模式
回应写入(毫秒测试部分.模式)''获得状态超时时间
回应写入(毫秒测试部分.超时)以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。