音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

如何解决asp.net负载均衡时Session共享的问题
日期:2021-09-07 22:40:24   来源:脚本之家

每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式

一、ASP.Net session存储方式

1、InProc模式(进程内模式) 。为默认设置。

会话状态存储在Web服务器上的内存中。

2、StateServer模式(状态服务器模式)。

会话状态存储在一个名为ASP.Net状态服务的单独进程中。这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网路场中的多个Web服务器。

3、SQL Server模式。

会话状态存储到一个SQL Server数据库中。这确保了在重新启动Web应用程序时会保留会话状态,并让会话状态可用于网路场中的多个Web服务器。

4、Custom模式

此模式允许您指定自定义存储提供程序。

5、Off模式

此模式禁止会话状态。

二、使用StateServer存储session

如果网站做了负载均衡,对于session存储就只能选择2、3、4了,下面先来介绍一下StateServer模式,首先得开启状态服务

然后再对web站点的“会话状态”进行设置

启用本机的状态服务

会自动在web.config里生成配置文件(如果不能生成就手动添加)

<sessionStatemode=”StateServer”stateConnectionString=”tcpip=loopback:42424″timeout=”20″/>

但是这里就存在一个问题,如果每台服务器都照上面配置,各服务器的Session都存储在本机的StateServer里面,还是没有启动共享的作用,这里就需要让一台StateServer共享出来让其他服务器访问,并将Session存储到上面,运行regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)

也可以修改StateServer的端口

接下来将其它服务器中web.config的配置文件进行修改(sessionState指向开启了允许远程访问的StateServer)

<sessionStatemode=”StateServer”stateConnectionString=”tcpip=10.16.5.30:22222″timeout=”20″/>

用StateServer这种共享式的session存储方式不仅有安全隐患,而且像上面那台共享的StateServer只要重启服务器,所有的session都会丢失,所以这种session存储方式不是很完美,用StateServer存储sesssion比较适合单机IIS开启多进程的。

三、使用SQL server存储session

要做保证安全并且不会因为重启服务器导致session丢失,那就要用sql server来存储session,ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的系统根目录Microsoft.NETFramework版本号文件夹中

cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
aspnet_regsql.exe -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password>
aspnet_regsql.exe -ssadd -sstype c -d ASPState -S 10.16.5.36 -U sa -P HAha789

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程