SharePoint學習筆記1–Asp.net與SharePoint的Session機制

來源:互聯網
上載者:User

1. Asp.net的三種Session機制   

    在ASP.NET的程式中要使用Session對象時,必須確保頁面的@page指令中EnableSessionState屬性是True或者Readonly,並且在web.config檔案中正確的設定了SessionState屬性。

  ASP.NET中Session的狀態保持是由web.config檔案中的標記下的標記的mode屬性來決定的。該屬性有四種可能的值:Off、Inproc、StateServer和SQlServer。

  設為Off會禁用Session。

  Inproc是預設的設定,這種模式和以前的ASP的工作階段狀態的方法是類似的,會話的狀態會被儲存在ASP.NET進程中,它的優點是顯而易見的:效能。進程內的資料訪問自然會比誇進程的訪問快。然而,這種方法Session的狀態依賴於ASP.NET進程,當IIS進程崩潰或者正常重起啟時,儲存在進程中的狀態將丟失。

  為了克服Inproc模式的缺點,ASP.NET提供了兩種進程外保持工作階段狀態的方法。

  ASP.NET首先提供了提供了一個Windows服務:ASPState,這個服務啟動後,ASP.NET應用程式可以將mode屬性設定為“SateServer”,來使用這個Windows服務提供的狀態管理方法。

  除了在web.config檔案中設定mode屬性為StateServer外,還必須設定運行StateServer伺服器的IP地址和連接埠號碼.如果在IIS所在的機器運行StateServer則IP地址就是127.0.0.1,連接埠號碼通常是42424.配置如下:

  mode=”StateServer”

  stateConnectionString="tcpip=127.0.0.1:42424"

  使用這種模式,工作階段狀態的儲存將不依賴IIS進程的失敗或者重啟,會話的狀態將儲存在StateServer進程的記憶體空間中。

  另一種工作階段狀態模式是SQLServer模式。這種模式是將會話的狀態儲存在SQL Server資料庫中的。使用這種模式前,必須至少有一台SQL Server伺服器,並在伺服器中建立需要的表和預存程序。.NET SDK提供了兩個指令碼來簡化這個工作:InstallSqlState.sql和UnInstallSqlState.sql。這兩國檔案存放在下面路徑中:

  WinntMicrosoft.NETFramework

  要配置SQL Server 服務器,可以在命令列中運行SQL Server提供的命令列工具osql.exe

  osql -s [server name] -u [user] -p [password]

  例如:

  osql -s (local) -u as -p “”-i InstallSqlState.sql

  做好必要的資料庫準備工作後,將web.config檔案中的sessionstate元素的mode屬性改為”sqlserver”,並指定SQL連接字串。具體如下:

  mode="SQLServer"

  sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"

  使用SQLServer模式處了可以使Session的狀態不依賴於IIS伺服器之外,還可以利用SQL Server的叢集,使狀態儲存不依賴於單個的SQL Server,這樣就可以為應用程式提供極大的可靠性。

 

2. 如何在SharePoint中使用Session

 

    很多開發人員喜歡在ASP.NET程式中使用Session,用它來記錄當前登入使用者的一些資訊。但是在SharePoint 2010系統中,預設是禁用Session功能的。如果在一個應用程式中使用了Session,你很可能會發現代碼會拋出一個“引用的對象沒有執行個體化”異常。如果通過Visual Studio調試一下代碼,就能發現HttpContext.Session屬性返回的是null。

   

 

    要在一個SharePoint 2010程式中使用Session,開發人員會面臨一些潛在的問題。SharePoint 2010系統很可能被部署為一個伺服器陣列的模式,它可能包含有多台Web前端伺服器,使用者的Http請求會被NLB機制分發到多台Web前端伺服器的任意一台上。這就要求開發人員應該儘可能的編寫出“無狀態”的代碼,也就是說,代碼不能依賴於某一台具體的伺服器,因為開發人員沒有辦法確定自己的代碼會始終運行在一個伺服器上。有可能一個使用者瀏覽一個頁面時,它的請求被分配到Web伺服器A,然後當使用者重新整理一下頁面,這次請求則被分配到了Web伺服器B。

在這樣的伺服器陣列模型中,代碼在伺服器的記憶體裡面儲存的任何資料,都會隨著下次使用者重新整理後,處理使用者請求的伺服器轉移,而變得沒有意義。

SharePoint 2010由於某種原因,預設禁止在代碼中使用Session。禁止的理由很可能是為了預防開發人員寫出過於依賴Session的“有狀態”代碼,因為ASP.NET的Session預設是儲存在伺服器的記憶體中。一旦這些代碼被部署到分布式伺服器陣列環境中,它們就很可能由於依賴僅僅儲存在某一台伺服器記憶體中的Session資料而出錯。

    ASP.NET的Session其實是可以配置成StateServer和SQLServer模式。StateServer模式是使用一台特定伺服器上的一個Session State服務,來為伺服器陣列中的所有伺服器提供狀態儲存服務,SQLServer模式則是將所有狀態資訊儲存到SQL Server資料庫中。這兩個模式都是能夠很好的支援分布式伺服器陣列模型的。

   

   所以,我們可以通過修改Web應用程式的web.config檔案,手工啟用Session。不過,SharePoint 2010其實已經內建了一個PowerShell指令,讓我們輕鬆的在伺服器陣列裡面啟用Session。這個指令就是Enable-SPSessionStateService。

  

 

   如所示,開啟SharePoint 2010 Management Shell,輸入如上指令,就可以在SharePoint設定資料庫所在的SQL Server伺服器上,自動建立一個名為“SharePoint_Session_State”的資料庫,然後在所有Web應用程式的web.config中自動添加相應的條目。

 

   

    這個自動添加的條目,指明了Session將使用SQLServer模式以及存放Session的資料庫連接字串。開啟SQL Server Management Studio,就能找到這個由Enable-SPSessionStateService自動建立的資料庫,它僅包含2個Table。

   

Enable-SPSessionStateService還提供了幾個其他的參數。-DefaultProvision參數表示將直接使用SharePoint系統現有的設定資料庫(預設就是SharePoint_Config)作為存放Session資料的資料庫,而不再使用專門的資料庫(我非常不推薦這個做法)。-DatabaseServer和-DatabaseCredentials則可以指定使用自訂的資料庫伺服器(而不是預設的放置設定資料庫的那個伺服器)和資料庫連接帳戶。如果需要做一個反向操作,即在伺服器陣列禁止Session的使用,可以使用Disable-SPSessionStateService指令。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.