正在作的一個項目,用的是框架結構,頁面間傳值除了登錄id用的是cookie通常用的都是session,,可是偶爾會出現session值丟失的問題,網上查詢了一下,框架session傳值丟失的問題不少,但都沒有什麼好得解決辦法,只有綜合網友的方法,將bug降到最低。web
1框架中session易丟失的緣由:sql
由於一個框架集有多個頁面,當框架或者框架內文件刷新時,IE和IIS會有時會不肯定是否全部頁面都來在同一請求,這時候session就會被拒絕訪問,因而session所有丟失了,只要使用框架,這種現象很難避免。瀏覽器
2常規的一些解決辦法:cookie
(1)session是比較容易丟失的,數量最好不要太多。我接手的一個系統中 被人寫了20多個session 就很容易丟失。。最後改爲了用狀態服務來保存。就OK了。不過指向的服務器須要開啟一個服務session
管理工具-服務-啓動asp.net StateServer 就能夠了 ,在WEB.CONFIG中設置
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="1000"/>併發
(2)在Internet信息服務-->默認站點-->屬性-->web站點下的鏈接超時,把這個值該大些,同時,設置session.timeout。框架
這個方法不太可取,每一個pc機都得改ie配置asp.net
(3)嘗試一下將將session暫時保存到viewstate當中
(4)有個網友給了個挺有創意的方法:less
你爲何非得用session呢?用一個類定義一些靜態字段,把要保存在session中的值保存在字段中,不管什麼時候均可以訪問
class SaveSession
{
public static string User;
public static string Name;
}tcp
//在保存session的地方如此代替
SaveSession.User = txtUser.Text;
SaveSession.Name = txtName.Text;
//在要取session的地方如此代替
string strUser = SaveSession.User;
string strName = SaveSession.Name;
在實際操做中,這種方法是不可取的,
(1)沒有考慮到實際應用中併發操做的狀況,使用靜態字段,a和b同時使用,a可能調用的是b的數據,而b一樣可能調用的是a的數據,若是用的人多了 ,更慘不忍睹了。
(2)即便瀏覽器關閉,用戶中止操做,靜態字段還保留着值,若是不處理的話下一我的讀取的時候就會出現數據錯誤的大問題了。。
若是上面的方法都嘗試過,丟失的問題還比較嚴重,呵呵,有不小的多是框架頁面跳轉加載傳值的問題了,不能誤解爲session問題,雖然設置斷點跟蹤也是session丟失,實際否則(我就是...非常鬱悶),簡單拿下個人例子剖析一下:
1框架:
<frameset rows="100%,0%" name="forumlist">
<frame name="top" src="Default4.aspx" >
<frame name="bottom" src="about:blank">
</frameset>
2 .top頁面保存session【「id」】
前臺將session保存到本後臺頁面
$("#btn2").click(function(){
$("input").each(function(){
if (this.checked)
{
$.get("ym_xtwh_rcwh_kzwh_man.aspx",{ID:this.value},function(data){
});
if (window.parent.forumlist.rows != "50%,*")
{
window.parent.forumlist.rows = "50%,*"
}
form1.action="ym_xtwh_rcwh_kzwh_mod.aspx";
form1.target="bottom";
form1.submit();
}
});
});
本頁面後臺接收:
if (!string.IsNullOrEmpty(Request.QueryString["ID"]))
{
Session["KZDM"] = Request.QueryString["ID"].ToString();
}
3.框架加載bottom頁面
判斷session
if (Session["KZDM"] != null)
錯誤現象:加載的時候常常會第一次取不到session值,斷點跟蹤session也是在框架加載頁面的時候值丟失,誤覺得是session丟失
解決方法:
將上面的紅色代碼框架加載bottom頁面部分放到回調函數以內:
$("#btn2").click(function(){
$("input").each(function(){
if (this.checked)
{
$.get("ym_xtwh_rcwh_kzwh_man.aspx",{ID:this.value},function(data){
if (window.parent.forumlist.rows != "50%,*")
{
window.parent.forumlist.rows = "50%,*"
}
form1.action="ym_xtwh_rcwh_kzwh_mod.aspx";
form1.target="bottom";
form1.submit();
});
}
});
});
將此問題記錄一下 增強本身記憶