一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 如何解決asp.net負載均衡時Session共享的問題

如何解決asp.net負載均衡時Session共享的問題

2020-06-04 14:50king_819 ASP.NET教程

這篇文章主要介紹了解決asp.net負載均衡時Session共享的問題,詳細的介紹了ASP.Net session存儲方式以及如何實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

每個客戶端在訪問網站時,都會創建相應的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模式,首先得開啟狀態服務

如何解決asp.net負載均衡時Session共享的問題

然后再對web站點的“會話狀態”進行設置

如何解決asp.net負載均衡時Session共享的問題

啟用本機的狀態服務

如何解決asp.net負載均衡時Session共享的問題

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

?
1
<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 代表禁止)

如何解決asp.net負載均衡時Session共享的問題

也可以修改StateServer的端口

如何解決asp.net負載均衡時Session共享的問題

接下來將其它服務器中web.config的配置文件進行修改(sessionState指向開啟了允許遠程訪問的StateServer)

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

用StateServer這種共享式的session存儲方式不僅有安全隱患,而且像上面那臺共享的StateServer只要重啟服務器,所有的session都會丟失,所以這種session存儲方式不是很完美,用StateServer存儲sesssion比較適合單機IIS開啟多進程的。

如何解決asp.net負載均衡時Session共享的問題

三、使用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

如何解決asp.net負載均衡時Session共享的問題

該命令對此應用進行了持久化操作。這時會看到ASPState數據庫里面多了兩張表,ASPStateTempSession就可以用來保存Session,接下來要對web站點的“會話狀態”進行設置

如何解決asp.net負載均衡時Session共享的問題

ASPStateTempSessions 表中的SessionID ,包括兩個部分:網站生成的24位SessionID及8位AppId組成,對于不同的站點,其AppId和AppName也不同,在能夠在不同站點下Session共享,就得保證這個32位的SessionID 一致,所以可以通過修改存儲過程TempGetAppID,使其得到的SessionID與AppName無關,修改TempGetAppID如下

如何解決asp.net負載均衡時Session共享的問題

修改web.config(在數據庫中為ASPState單獨分配一個帳戶)

?
1
<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中:

?
1
2
3
4
5
6
<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)定期對超時的狀態數據進行刪除。

如何解決asp.net負載均衡時Session共享的問題

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

數據庫中此表的SessionID字段的值,由SessionID和AppID共同組成,最后8位為AppID所以,后8位之前一定是SessionID。例如,存儲在數據庫中的值為"ekr30c3mwvnc3145yrswew3a037e5e5a",后8位的"037e5e5a"為AppID,而前面的"ekr30c3mwvnc3145yrswew3a"為應用程序中你可以使用Session.SessionID獲得的字符串。

如何解決asp.net負載均衡時Session共享的問題

3、如何判斷Session何時被更新的?

Session記錄被更新時會同時更新Expires和LockDateLocal,Expires字段為UTC時間,如果想通過本地之間進行比較判斷還是需要使用LockDateLocal。

4、獲得Web.config配置文件節點信息的程序?

''獲得Web.config文件配置實例

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

''獲得狀態配置節點實例

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

''獲得狀態模式

?
1
Response.Write(mSessionStateSection.Mode)

''獲得狀態超時時間

?
1
Response.Write(mSessionStateSection.Timeout)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.51cto.com/kerry/2314925

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 婷婷色网 | 5278欧美一区二区三区 | 农村脱精光一级 | 亚洲欧美在线观看首页 | 午夜精品免费 | 爸爸的宝贝小说全文在线阅读 | 日本亚洲免费 | 日本妇人成熟免费不卡片 | 二次元美女脱裤子让男人桶爽 | 亚洲qvod图片区电影 | 国产91在线精品 | 国产亚洲精品自在线亚洲情侣 | 好大好爽好舒服视频 | 成人小视频在线观看免费 | 性插图动态图无遮挡 | 日本欧美不卡一区二区三区在线 | 免费高清视频日本 | blacked最大的吊 | 加勒比久草| 毛片免费视频观看 | 日本黄a三级三级三级 | 亚洲第一天堂无码专区 | 毛片网站免费观看 | 精品久久一 | 99热久久这里只精品国产www | 日韩欧美国产免费看清风阁 | 欧美同志video 在线观看 | 精精国产www视频在线观看免费 | 秋霞理论在一l级毛片 | 日韩免费高清完整版 | 99精品免费在线 | 香蕉人人超人人超碰超国产 | 97香蕉超级碰碰碰久久兔费 | 久久久久伊人 | 操大肥b| 国产成人8x视频一区二区 | 免费jizz在在线播放国产 | 涩色网站 | 久草在在线免视频在线观看 | 古装床戏做爰无遮挡三级 | 视频在线观看一区二区 |