你提到你在負載平衡的環境中有這個問題,對吧?我假設你正在使用存儲會話數據的默認「In Proc」方法。如果是這樣的話,那麼我想我知道會發生什麼。 (爲了爭辯,我將假設2臺服務器,但是如果你有更多的服務器並不重要)
你被髮送到ServerA並創建一個會話。因爲這是在進程中ServerB不知道它。最終(以及發生的方式是如何設置您的負載均衡器的問題。粘滯會話?Cookie?循環?),您將被髮送到ServerB。因爲該服務器有不知道你已經有一個會話;會創建一個新的會話ID並給您一個新的會話ID。
那麼,爲什麼它在你的確切的repro步驟下發生?那麼,我的直覺是,如果有足夠的時間和負載,你會看到它只是從/ page1導航到/ page2。再次 - 這取決於您的負載均衡器是如何設置的,但可能是因爲您正在更改觸發某些內容的協議,並將您發送到池中的另一臺服務器。
如何解決?
要開始,請確保您的machine.config中具有相同的機器密鑰。如果你沒有訪問權限,我認爲它會在web.config中工作,但我沒有嘗試過。
現在,建立另一種存儲會話狀態的方式。在Sql Server或者MySql或者Postgres或者任何地方。如果你擁有SQL Server,它將是驅動程序構建以來最簡單的,但是如果你有另一個數據庫,你需要構建或者找到一個能夠實現它的庫。我參與了一個使用Postgres存儲會話狀態的項目。
我們使用npgsql作爲駕駛員conenct到服務器,並建立了自己的PgsqlSessionProvider:SessionStateStoreProviderBase
和掛鉤起來其實是很容易的
<sessionState mode="Custom" customProvider="PgsqlSessionProvider">
<providers>
<add name="PgsqlSessionProvider" type="My.namespace.PgsqlSessionStateStore" connectionStringName="connectionStringName" writeExceptionsToEventLog="true" />
</providers>
</sessionState>
[我怎麼可以共享一個asp.net會話之間的
來源
2013-10-17 16:03:32
Joe
可能重複HTTP和https](http:// stackoverflow。COM /問題/ 567535 /何燦的i-共享的-ASP淨會話間的HTTP和HTTPS) –
我不知道爲什麼它的工作在其他瀏覽器,但它不應該是。除非您將會話cookie配置爲安全,否則它們在http和https之間始終會有所不同。 –
呀,好點,但我的理解是B/C我是不是我的cookie設置爲與餅乾「安全=真正的」應該與HTTPS和HTTP持續。這是否是好的做法,這是客戶的願望。 –