国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在ASP.NET中使用Session常見問題集錦

2024-07-10 12:55:08
字體:
來源:轉載
供稿:網友

總是在壇子里面回答相同的問題有時候真是一種折磨,我想有必要在各個方面做一個總結,以減輕這種重復勞動。
這次總結的是有關session的話題,錯誤在所難免請指教,偶會虛心接受的。詳細信息請參考:
http://blog.csdn.net/cuike519/archive/2005/09/27/490316.aspx

馬上就國慶了,昨天得知母親要來這里看我,我真是萬分高興,現在什么都不想做只想過十一。

用戶永遠都是上帝,現在有支持問題需要解決,手上所有的事情都要暫停,再有時間會總結一下其它的部分,比如:datagrid的使用問題。

在壇子里經常看到一些關于session的問題,下面做一個總結,希望對大家有所幫助:

問:為什么session在有些機器上偶爾會丟失?
答:可能和機器的環境有關系,比如:防火墻或者殺毒軟件等,嘗試關閉防火墻。

問:為什么當調用session.abandon時并沒有激發session_end方法?
答:首先session_end方法只支持inproc(進程內的)類型的session。其次要激發session_end方法,必須存在session(即系統中已經使用session了),并且至少要完成一次請求(在這次請求中會調用該方法)。

問:為什么當我在inproc模式下使用session會經常丟失?
答:該問題通常是由于應用程序被回收導致的,因為當使用進程內session時,session是保存在aspnet_wp進程中,當該進程被回收session自然也就沒有了,確定該進程是否被回收可以通過查看系統的事件查看器獲得信息。
具體信息請參考:
session variables are lost intermittently in asp.net applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;q316148
在1.0的時候也有一個bug會導致工作進程被回收并重啟,該bug已經在1.1和sp2中修復。
關于該bug的詳細信息請參考:
asp.net worker process (aspnet_wp.exe) is recycled unexpectedly.
http://support.microsoft.com/default.aspx?scid=kb;en-us;q321792

問:為什么當session超時或者abandoned后,新session的id和原來的相同?
答:因為sessionid是保存在客戶端瀏覽器的實例里,當session超時在服務器重新建立session時,將使用瀏覽器傳來的sessionid,所以當session超時后,再重新建立后sessionid并不變。

問:為什么每次請求的sessionid都不相同?
答:該問題可能是沒有在session里面保存任何信息引起的,即程序中任何地方都沒有使用session。當session中保存信息之后sessionid將一直和瀏覽器相關,此時的sessionid將不會在變化。

問:asp和asp.net之間是否可以共享session?
答:可以。但是這是一個比較復雜的過程,微軟提供了官方的解決方案,請參考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/converttoaspnet.asp

問:什么類型的對象可以保存在session里?
答:這依賴使用的session的模式,當使用的是進程內(inproc)的session那么可以輕松的保存任何對象。如果你使用了非inproc的模式,則只能保存可以序列化和反序列化的對象,如果此時保存的對象不支持序列化,則不能保存到這種模式(非inproc)的session里。

問:為什么在session_end中不能使用response.redirect和server.transfer方法跳轉頁面?
答:session_end是一個在服務器內部激發的事件處理函數。它是基于一個服務器內部的計時器的,在激發該事件時服務器上并沒有相關的httprequest對象,因此此時并不能使用response.redirect和server.transfer方法。

問:在session_end中是否可以獲得httpcontext對象?
答:不行,因為這個事件并沒有和任何的請求(request)相關聯,沒有基于請求的上下文。

問:在web service中該如何使用session?
答:為了在web service中使用session,需要在web service的調用方做一些額外的工作,必須保存和存儲調用web service時使用的cookie。詳細信息請參考msdn文檔的httpwebclientprotocol.cookiecontainer屬性。然而,如果你使用代理服務器訪問web service由于框架的限制,兩者不能共享session。

問:在自定義自己的httphandler的時候,為什么不能使用session?
答:在實現自己的httphandler的時候,如果希望使用session必須實現下面的兩個標記接口中的一個:irequiressessionstate和ireadonlysessionstate,這些接口沒有任何方法需要實現,只是一個標記接口和使用inamingcontainer接口的方法一樣。

問:當我使用webfarm時,當我重定向到其他的web服務器時session為什么會丟失?
答:詳細信息請參考:
prb: session state is lost in web farm if you use sqlserver or stateserver session mode
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056

問:為什么我的session在application_onacquirerequeststate方法中無效?
答:session只有在httpapplication.acquirerequeststate事件調用以后才會有效。
詳細信息請參考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp

問:如果使用了cookieless,我該如何從http頁面定向到https?
答:請嘗試下面的方法:
string originalurl = "/fxtest3/sub/foo2.aspx";
string modifiedurl = "https://localhost" + response.applyapppathmodifier(originalurl);
response.redirect(modifiedurl);

問:session在global.asax中的那些事件中有效?
答:session只有在acquirerequeststate事件之后有效,該事件之后的事件都可以使用session。


問:如何獲得當前session中保存的所有對象?
答:可以通過遍歷所有的session.keys來獲得。代碼如下:
arraylist sessioncollection = new arraylist();
foreach (string strkey in session.keys){
sessioncollection.add(session[strkey]);
}

問:是否可以在不同的應用程序中共享session?
答:不能直接共享。可以參考如何在asp和asp.net之間共享session。

問:session.abandon和session.clear有何不同?
答:主要的不同之處在于當使用session.abandon時,會調用session_end方法(inproc模式下)。當下一個請求到來時將激發session_start方法。而session.clear只是清除session中的所有數據并不會中止該session,因此也不會調用那些方法。

問:為了可以順序訪問session的狀態值,session是否提供了鎖定機制?
答:session實現了reader/writer的鎖機制:
當頁面對session具有可寫功能(即頁面有<%@ page enablesessionstate="true" %>標記),此時直到請求完成該頁面的session持有一個寫鎖定。
當頁面對session具有只讀功能(即頁面有<%@ page enablesessionstate="readonly" %>標記),此時知道請求完成該頁面的session持有一個讀鎖定。
讀鎖定將阻塞一個寫鎖定;讀鎖定不會阻塞讀鎖定;寫鎖定將阻塞所有的讀寫鎖定。這就是為什么兩個框架中的同一個頁面都去寫同一個session時,其中一個要等待另一個(稍快的那個)完成后,才開始寫。

問:session平滑超時意味著什么?
答:session平滑超時意味著只要你的頁面訪問(使用)了session,超時時間將被刷新(可以理解為重新計時),即從該頁面請求開始,將重新計算超時時間。但是,該頁面不能禁用session。它會自動的訪問當前頁面的session,刷新超時時間。

問:在global.asax中的事件處理函數中session為什么無效?
答:依賴于在哪個事件處理函數中使用session,session在acquirerequeststate事件之后才有效,該事件之后的所有事件處理函數都可以使用session,之前的則不能。

問:當我寫一個依賴于當前應用的session的組件時,為什么不能直接使用session["key"]獲得其值?
答:session["key"]實際上是this.session["key"],它是作為page的一個屬性提供的,所以在你的組件中不能直接使用這個屬性。你可以通過下面的方式使用session:
httpcontext.current.session["key"] = "my seesion value";

問:當我使用inproc模式保存session時,此時的session是保存在哪里?
答:不同的iis的處理方式不同,
當使用的是iis5的時候session是保存在aspnet_wp.exe的進程空間里的。
當使用的是iis6時,默認情況下所有的應用程序共享應用程序池,session保存在w3wp.exe的進程空間中。

問:session的超時設置是分鐘還是秒?
答:是分鐘,默認為20分鐘。

問:當頁面出現錯誤后我的session是否將被保存?我需要在session_end中處理一些清理工作,但是失敗了,為什么?
答:session_end只有在session運行在inproc模式下才會被執行。session_end使用的帳號是運行aspnet_wp工作進程的帳號(這個可以在machine.config中設置)。因此,如果在session_end方法里,使用集成安全性鏈接到sql,它將使用aspnet_wp進程的帳號打開鏈接,此時成功與否則依賴于你的sql的安全性設置。

問:為什么當我設置cookieless為true是我在重定向的時候會丟失session?
答:當使用cookieless時,你必須使用相對路徑替換程序中的絕對路徑,如果使用絕對路徑asp.net將無法在url中保存sessionid。
例如:將/mydir/mysubdir/default.aspx換成../default.aspx即可。

問:如何將sortedlist存儲到session或者cache里?
答:請參考下面的方法:
sortedlist x = new sortedlist();
x.add("key1", "valuea");
x.add("key2", "valueb");
保存到session中:
session["sortedlist1"] = x;
使用下面方法獲得之:
sortedlist y = (sortedlist) session["sortedlist1"];
chahe則同理。

問:我為什么會獲得這樣的錯誤信息“session state can only be used when enablesessionstate is set to true, either in a configuration file or in the page directive”?
答:這個問題可能在一個已經安裝了microsoft visual studio .net開發環境的機器上,再安裝window sharepoint server(wss)后出現。
wss isapi過濾器會處理所有的請求。當你通過虛擬目錄瀏覽一個asp.net的應用程序時,isapi過濾器不會給文件夾目錄分配url。
解決方法是:不要再安裝了wss的機器上使用session。
詳細信息請參考:
session state cannot be used in asp.net with windows sharepoint services
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376

問:如何刪除session變量?
答:想要刪除session變量可以使用httpsessionstate.remove()方法。

問:是否有辦法知道應用程序的session在運行時占用了多少內存?
答:沒有。目前這個值時無法考證的,至少我現在還沒有看到這方面的資料。但是可以通過性能監視器以及程序代碼大概估算出來一個值。

問:當頁面中是否了frameset,發現在每個frame中顯示頁面的sessionid在第一次請求時都不相同,為什么?
答:原因是你的frameset是放在一個htm頁面上而不是aspx頁面。
在一般情況下,如果frameset是aspx頁面,當你請求頁面時,它首先將請求發送到web服務器,此時已經獲得了sessionid,接著瀏覽器會分別請求frame中的其他頁面,這樣所有頁面的sessionid就是一樣的,就是frameset頁面的sessionid。
然而如果你使用html頁面做frameset頁面,第一個請求將是html頁面,當該頁面從服務器上返回是并沒有任何session產生,接著瀏覽器會請求frame里面的頁面,這樣這些頁面都會產生自己的sessionid,所以在這種情況下就會出現這種問題。當你重新刷新頁面時,sessionid就會一樣,并且是最后一個請求頁面的sessionid。

問:是否可以將不同應用程序的session保存在相同的sql server服務器的不同數據庫上。
答:可以,請參考:
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對象,因為該事件并沒有和任何請求相關聯,因此不存在上下文對象。

問:在sqlserver模式下使用session,為什么我的session不過期?
答:在sqlserver模式下,session的過期是通過sql agent的注冊工作完成的,請檢查你的sql agent是否運行?

問:當我設置enablesessionstate為“readonly”后,但是我在inproc模式下依然可以修改session的值,這是為什么?
答:即使enablesessionstate標示為readonly,但是在inproc模式下用戶依然可以編輯session。唯一不同的是,在請求過程中session將不會被鎖住。

問:我如何才能避免在鏈接sql時指定密碼?
答:使用信任鏈接或者使用加密的鏈接串。有關這方面的詳細信息請參考:
how to use the asp.net utility to encrypt credentials and session state connection strings
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290

問:我在我自己的類中該如何使用session呢?
答:可以使用httpcontext.current.session方式使用,具體方法如下:
httpcontext.current.session["sessionkey"] = "sessionvalue";
類似的你還可以使用這種方式使用application對象。


問:為什么在切換成sqlserver模式后我的請求被掛起了?
答:檢查在session里面是否都保存的是可以保存在sqlserver模式下的對象,即這些對象必須支持序列化。


問:當session設置成cookieless后會有什么影響?
答:當把cookieless設置成true時,主要會有下面的約束:
1、在頁面中不能使用絕對鏈接
2、在應用程序中在除了http和https之間的切換時需要完成一些其他的步驟。
如果發送一個鏈接給其他人,此時的url里面將包含session id的信息,所以兩個人將公用一個session。

問:是否可以將session保存在數據庫中?
答:當然可以,詳細信息請參考:http://support.microsoft.com/default.aspx?scid=kb;en-us;311209

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泽州县| 永康市| 乾安县| 梅河口市| 南阳市| 靖宇县| 遵义县| 贡嘎县| 伊春市| 包头市| 布尔津县| 和田市| 涞源县| 武乡县| 延安市| 集贤县| 沾益县| 莲花县| 若尔盖县| 奉新县| 蓬溪县| 富川| 乌拉特后旗| 鞍山市| 吉水县| 巍山| 井陉县| 永嘉县| 衡水市| 海门市| 绥芬河市| 洪湖市| 太仓市| 德庆县| 新源县| 胶南市| 阜新市| 云和县| 太仆寺旗| 永修县| 永昌县|