视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何解决asp.net负载均衡时Session共享的问题
2020-11-27 22:34:45 责编:小采
文档


注:<Database Name>为数据库名为ASPState ,<SQL Server IP>为数据库实例名像 IBM-PC\SQLEXPRESS (若数据库不是2005的不要写ip地址,否则会连接失败),<User Name>为sa(或与sa同等权限的),<Password> 为 sa用户名的密码会话定义成功,但是会提示在web应用中进行相应的配置,此时查看SQLServer会发现增加了数据库ASPState,但是没有表。

在命令行下运行如下命令:aspnet_regsql.exe -ssadd -sstype p -S <SQL Server IP> -U <User Name> -P <Password>

aspnet_regsql.exe-ssadd-sstypep-S10.16.5.36-Usa-PHAha7

该命令对此应用进行了持久化操作。这时会看到ASPState数据库里面多了两张表,ASPStateTempSession就可以用来保存Session,接下来要对web站点的“会话状态”进行设置

ASPStateTempSessions 表中的SessionID ,包括两个部分:网站生成的24位SessionID及8位AppId组成,对于不同的站点,其AppId和AppName也不同,在能够在不同站点下Session共享,就得保证这个32位的SessionID 一致,所以可以通过修改存储过程TempGetAppID,使其得到的SessionID与AppName无关,修改TempGetAppID如下

修改web.config(在数据库中为ASPState单独分配一个帐户)

<sessionStatemode="SQLServer"sqlConnectionString="datasource=10.16.5.36;userid=sa;password=HAha7"cookieless="false"timeout="20"></sessionState>

这样就实现了sql server对session的存储,当然也可以用memcache来存储session

四、ASP.NET错误,验证视图状态MAC失败

但在在网站登录访问时却报错了“ASP.NET错误,验证视图状态MAC失败”,baidu了一下,大部分人都说是在页里或web.config里加EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never" 这些属性的设置。但是这并不从根本上解决问题,相反这样做了反而更加不安全。不能说出错就不用了?出错得解决问题,得从根本上解决问题。

分析错误原因:

ASP.NET 中有很多涉及到加密的东西,比如 ViewState,比如 FormsAuthenticationTicket,这些东西都是要传送到客户端的,加密才能保障其安全性。加密就得有个私钥,但这个私钥我们并没有指定啊,那是因为 ASP.NET 自动生成的。但是如果是在网络场或群集中,或者在某些做了 CDN 加载的虚拟主机中,由于涉及到多台服务器 ASP.NET 就无法为各台机器自动生成相同的私钥,这就造成了这个服务器产生的数据,那台服务器解析不出来。于是就出错了。怎么办?既然 ASP.NET 在多台服务器上无法自动随机生成相同的私钥,那只有我们自己指定了。

MachineKey生成工具,自动生成代码

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>删除</text></view>
 </view>
</view>

MachineKey的作用:

ASP.net 使用 forms authentication 时的 cookie 数据的加密和解密。以确保这部分数据不会被篡改viewstate 数据的加密和解密。以确保这部分数据不会被篡改。使用进程外session(out-of-process session)时,对会话状态标识进行验证。利用SessionStateMode的SQLServer来实现session共享,毕竟是微软的东西,具有一定的局限行,只能是sql server。其实session共享可以用其他的数据库,比如memcache、redis

五、ASP.NET 状态数据库FAQ

1、如果把SESSION值存放到数据库中去,用户关闭了程序那怎么样清空数据库里的SESSION值呢?

实际ASP.NET在创建状态数据库的时候会在SQL Server代理(SQL Server Agent)的作业中添加一个作业,名称为<状态数据库名>_Job_DeleteExpiredSessions。如果打开SQL Server代理服务数据库可以通过添加的状态记录的超时时间字段(Exprires)定期对超时的状态数据进行删除。

2、ASPStateTempSessions表中的SessionId字段如何使用?

数据库中此表的SessionID字段的值,由SessionID和AppID共同组成,最后8位为AppID所以,后8位之前一定是SessionID。例如,存储在数据库中的值为"ekr30c3mwvnc3145yrswew3a037e5e5a",后8位的"037e5e5a"为AppID,而前面的"ekr30c3mwvnc3145yrswew3a"为应用程序中你可以使用Session.SessionID获得的字符串。

3、如何判断Session何时被更新的?

Session记录被更新时会同时更新Expires和LockDateLocal,Expires字段为UTC时间,如果想通过本地之间进行比较判断还是需要使用LockDateLocal。

4、获得Web.config配置文件节点信息的程序?

''获得Web.config文件配置实例

Dim configuration As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config")

''获得状态配置节点实例

Dim mSessionStateSection As System.Web.Configuration.SessionStateSection = CType(configuration.GetSection("system.web/sessionState"),System.Web.Configuration.SessionStateSection)

''获得状态模式

Response.Write(mSessionStateSection.Mode)

''获得状态超时时间

Response.Write(mSessionStateSection.Timeout)

下载本文
显示全文
专题