從別人那拷下來的幾點Session使用的經(jīng)驗
更新時間:2007年04月13日 00:00:00 作者:
問:當(dāng)頁面中是否了frameset,發(fā)現(xiàn)在每個frame中顯示頁面的SessionID在第一次請求時都不相同,為什么?
答:原因是你的frameset是放在一個htm頁面上而不是ASPX頁面。
在一般情況下,如果frameset是aspx頁面,當(dāng)你請求頁面時,它首先將請求發(fā)送到Web服務(wù)器,此時已經(jīng)獲得了SessionID,接著瀏覽器會分別請求Frame中的其他頁面,這樣所有頁面的SessionID就是一樣的,就是FrameSet頁面的SessionID。
然而如果你使用Html頁面做FrameSet頁面,第一個請求將是HTML頁面,當(dāng)該頁面從服務(wù)器上返回是并沒有任何Session產(chǎn)生,接著瀏覽器會請求Frame里面的頁面,這樣這些頁面都會產(chǎn)生自己的SessionID,所以在這種情況下就會出現(xiàn)這種問題。當(dāng)你重新刷新頁面時,SessionID就會一樣,并且是最后一個請求頁面的SessionID。
問:是否可以將不同應(yīng)用程序的Session保存在相同的SQL Server服務(wù)器的不同數(shù)據(jù)庫上。
答:可以,請參考:
FIX: Using one SQL database for all applications for SQL Server session state may cause a bottleneck
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680
問:在Session_End是我是否可以獲得有效的HttpSessionState和HttpContext對象?
答:你可以在這個方法中獲得HttpSessionState對象,可以直接使用Session來訪問即可。但是不能獲得HttpContext對象,因為該事件并沒有和任何請求相關(guān)聯(lián),因此不存在上下文對象。
問:當(dāng)我設(shè)置EnableSessionState為“ReadOnly”后,但是我在InProc模式下依然可以修改Session的值,這是為什么?
答:即使EnableSessionState標(biāo)示為ReadOnly,但是在InProc模式下用戶依然可以編輯Session。唯一不同的是,在請求過程中Session將不會被鎖住。
問:當(dāng)Session設(shè)置成cookieless后會有什么影響?
答:當(dāng)把cookieless設(shè)置成true時,主要會有下面的約束:
1、在頁面中不能使用絕對鏈接
2、在應(yīng)用程序中在除了Http和Https之間的切換時需要完成一些其他的步驟。
如果發(fā)送一個鏈接給其他人,此時的URL里面將包含Session ID的信息,所以兩個人將公用一個Session。
問:為了可以順序訪問Session的狀態(tài)值,Session是否提供了鎖定機(jī)制?
答:Session實現(xiàn)了Reader/Writer的鎖機(jī)制:
當(dāng)頁面對Session具有可寫功能(即頁面有<%@ Page EnableSessionState="True" %>標(biāo)記),此時直到請求完成該頁面的Session持有一個寫鎖定。
當(dāng)頁面對Session具有只讀功能(即頁面有<%@ Page EnableSessionState="ReadOnly" %>標(biāo)記),此時知道請求完成該頁面的Session持有一個讀鎖定。
讀鎖定將阻塞一個寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。這就是為什么兩個框架中的同一個頁面都去寫同一個Session時,其中一個要等待另一個(稍快的那個)完成后,才開始寫。
問:如果使用了cookieless,我該如何從HTTP頁面定向到HTTPS?
答:請嘗試下面的方法:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String modifiedUrl = "https://localhost" + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
問:什么類型的對象可以保存在Session里?
答:這依賴使用的Session的模式,當(dāng)使用的是進(jìn)程內(nèi)(InProc)的Session那么可以輕松的保存任何對象。如果你使用了非InProc的模式,則只能保存可以序列化和反序列化的對象,如果此時保存的對象不支持序列化,則不能保存到這種模式(非InProc)的Session里。
問:為什么每次請求的SessionID都不相同?
答:該問題可能是沒有在Session里面保存任何信息引起的,即程序中任何地方都沒有使用Session。當(dāng)Session中保存信息之后SessionID將一直和瀏覽器相關(guān),此時的SessionID將不會在變化。
答:原因是你的frameset是放在一個htm頁面上而不是ASPX頁面。
在一般情況下,如果frameset是aspx頁面,當(dāng)你請求頁面時,它首先將請求發(fā)送到Web服務(wù)器,此時已經(jīng)獲得了SessionID,接著瀏覽器會分別請求Frame中的其他頁面,這樣所有頁面的SessionID就是一樣的,就是FrameSet頁面的SessionID。
然而如果你使用Html頁面做FrameSet頁面,第一個請求將是HTML頁面,當(dāng)該頁面從服務(wù)器上返回是并沒有任何Session產(chǎn)生,接著瀏覽器會請求Frame里面的頁面,這樣這些頁面都會產(chǎn)生自己的SessionID,所以在這種情況下就會出現(xiàn)這種問題。當(dāng)你重新刷新頁面時,SessionID就會一樣,并且是最后一個請求頁面的SessionID。
問:是否可以將不同應(yīng)用程序的Session保存在相同的SQL Server服務(wù)器的不同數(shù)據(jù)庫上。
答:可以,請參考:
FIX: Using one SQL database for all applications for SQL Server session state may cause a bottleneck
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680
問:在Session_End是我是否可以獲得有效的HttpSessionState和HttpContext對象?
答:你可以在這個方法中獲得HttpSessionState對象,可以直接使用Session來訪問即可。但是不能獲得HttpContext對象,因為該事件并沒有和任何請求相關(guān)聯(lián),因此不存在上下文對象。
問:當(dāng)我設(shè)置EnableSessionState為“ReadOnly”后,但是我在InProc模式下依然可以修改Session的值,這是為什么?
答:即使EnableSessionState標(biāo)示為ReadOnly,但是在InProc模式下用戶依然可以編輯Session。唯一不同的是,在請求過程中Session將不會被鎖住。
問:當(dāng)Session設(shè)置成cookieless后會有什么影響?
答:當(dāng)把cookieless設(shè)置成true時,主要會有下面的約束:
1、在頁面中不能使用絕對鏈接
2、在應(yīng)用程序中在除了Http和Https之間的切換時需要完成一些其他的步驟。
如果發(fā)送一個鏈接給其他人,此時的URL里面將包含Session ID的信息,所以兩個人將公用一個Session。
問:為了可以順序訪問Session的狀態(tài)值,Session是否提供了鎖定機(jī)制?
答:Session實現(xiàn)了Reader/Writer的鎖機(jī)制:
當(dāng)頁面對Session具有可寫功能(即頁面有<%@ Page EnableSessionState="True" %>標(biāo)記),此時直到請求完成該頁面的Session持有一個寫鎖定。
當(dāng)頁面對Session具有只讀功能(即頁面有<%@ Page EnableSessionState="ReadOnly" %>標(biāo)記),此時知道請求完成該頁面的Session持有一個讀鎖定。
讀鎖定將阻塞一個寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。這就是為什么兩個框架中的同一個頁面都去寫同一個Session時,其中一個要等待另一個(稍快的那個)完成后,才開始寫。
問:如果使用了cookieless,我該如何從HTTP頁面定向到HTTPS?
答:請嘗試下面的方法:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String modifiedUrl = "https://localhost" + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
問:什么類型的對象可以保存在Session里?
答:這依賴使用的Session的模式,當(dāng)使用的是進(jìn)程內(nèi)(InProc)的Session那么可以輕松的保存任何對象。如果你使用了非InProc的模式,則只能保存可以序列化和反序列化的對象,如果此時保存的對象不支持序列化,則不能保存到這種模式(非InProc)的Session里。
問:為什么每次請求的SessionID都不相同?
答:該問題可能是沒有在Session里面保存任何信息引起的,即程序中任何地方都沒有使用Session。當(dāng)Session中保存信息之后SessionID將一直和瀏覽器相關(guān),此時的SessionID將不會在變化。
相關(guān)文章
.net?core利用PdfSharpCore操作PDF實例教程
操作pdf是我們?nèi)粘i_發(fā)中經(jīng)常遇到的功能,下面這篇文章主要給大家介紹了關(guān)于.net?core利用PdfSharpCore操作PDF實例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
ASP.NET Web應(yīng)用程序出現(xiàn)Maximum request length
ASP.NET Web應(yīng)用中導(dǎo)出數(shù)據(jù)時出現(xiàn)500-Internal Server Error,原因是客戶端請求長度超過了服務(wù)器配置的最大限制,解決方法在web.config增加maxRequestLength屬性,單位為字節(jié)(Byte),本文介紹ASP.NET Web應(yīng)用程序出現(xiàn)Maximum request length exceeded報錯的原因,一起看看吧2024-12-12
ASP.NET實現(xiàn)基于Forms認(rèn)證的WebService應(yīng)用實例
這篇文章主要介紹了ASP.NET實現(xiàn)基于Forms認(rèn)證的WebService應(yīng)用,實例分析了使用Forms進(jìn)行WebService身份認(rèn)證的相關(guān)技巧與實現(xiàn)方法,需要的朋友可以參考下2015-05-05
ASP.NET GridView 實現(xiàn)課程表顯示(動態(tài)合并單元格)實現(xiàn)步驟
GridView,ASP.NET中很常用的數(shù)據(jù)顯示控件,這里,我將用這個控件來實現(xiàn)課程表的顯示。首先說說課程表的顯示與普通記錄的顯示有何不同?感興趣的朋友可以了解下,或許對你有所幫助2013-02-02
基于ASP.NET的lucene.net全文搜索實現(xiàn)步驟
使用lucene.net搜索分為兩個部分,首先是創(chuàng)建索引,創(chuàng)建文本內(nèi)容的索引,其次是根據(jù)創(chuàng)建的索引進(jìn)行搜索, 感興趣的朋友可以了解下或許對你有所幫助2013-02-02
asp.net mvc 實現(xiàn)文件上傳帶進(jìn)度條的思路與方法
這篇文章主要給大家介紹了關(guān)于asp.net mvc 實現(xiàn)文件上傳帶進(jìn)度條的思路與方法,文中給出了詳細(xì)的示例代碼,相信對大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們可以參考借鑒,下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2016-12-12
asp.net點擊 查看更多 實現(xiàn)無刷新加載的實現(xiàn)代碼
asp.net點擊 查看更多 實現(xiàn)無刷新加載的實現(xiàn)代碼,需要的朋友可以參考下2012-06-06
.NET 6開發(fā)TodoList應(yīng)用之實現(xiàn)數(shù)據(jù)塑形
在查詢的場景中,還有一類需求不是很常見,就是在前端請求中指定返回的字段。所以這篇文章主要介紹了.NET 6如何實現(xiàn)數(shù)據(jù)塑形,需要的可以參考一下2022-01-01

