最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

如何解决asp.net负载均衡时Session共享的问题

来源:懂视网 责编:小采 时间:2020-11-27 22:34:45
文档

如何解决asp.net负载均衡时Session共享的问题

如何解决asp.net负载均衡时Session共享的问题:每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式 一、ASP.Net session存储方式 1、InProc模式(进程内模式) 。为默认设置。 会话状态存储在Web服
推荐度:
导读如何解决asp.net负载均衡时Session共享的问题:每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式 一、ASP.Net session存储方式 1、InProc模式(进程内模式) 。为默认设置。 会话状态存储在Web服

注:<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-PHAha789

该命令对此应用进行了持久化操作。这时会看到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=HAha789"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)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

如何解决asp.net负载均衡时Session共享的问题

如何解决asp.net负载均衡时Session共享的问题:每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式 一、ASP.Net session存储方式 1、InProc模式(进程内模式) 。为默认设置。 会话状态存储在Web服
推荐度:
标签: 共享 如何 net
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top