ashx使用context.Session[newToken] = loginName;保存令牌,若程式需要將一部分內容寫入服務器的外部檔案,再次訪問此ashx時,context.Session[newToken] 就為null值,若不寫入外部檔案或者僅讀取外部檔案,context.Session[newToken] 不為null,下示例中的writeFile(newToken, loginName);代碼不能執行,若執行則context.Session[newToken]消失
web.config中增加了<sessionState mode="InProc" timeout="1800"></sessionState>也不行
其次我還發現,這種情況若使用HttpRuntime.Cache或者static同樣存在此問題。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Xml;
namespace ECInterSys
{
/// <summary>
/// testSession 的摘要說明
/// </summary>
public class testSession : IHttpHandler,IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string login = context.Request["login"];
if (login!=null&&login.Equals("yes"))
{
string loginName = context.Request["loginName"];
//string pwd= context.Request["pwd"];
//.....驗證用戶密碼正確性
string newToken = Guid.NewGuid().ToString();
context.Session[newToken] = loginName;
//writeFile(newToken, loginName);//這個是寫入服務器外部檔案的demo,若執行這一句話,則再次訪問時context.Session[token]==null
context.Response.Write(newToken);
return;
}
string token = context.Request["token"];
if (!string.IsNullOrEmpty(token))
{
//驗證令牌
if (context.Session!=null&& context.Session[token]!=null)
{
context.Response.Write(context.Session[token]);
return;
}
}
context.Response.Write("hello!");
}
//測驗Session存盤若寫入本地檔案則Session訊息
//示例中寫入本地檔案的內容僅供參考,實際使用中不寫登錄資訊
//示例僅僅是表示需要寫外部檔案
private void writeFile(string token,string loginName)
{
string fileName= string.Format(@"{0}bin\outerFile", AppDomain.CurrentDomain.BaseDirectory.ToString());
try
{
XmlDocument xml = new XmlDocument();
if (!File.Exists(fileName))
{
XmlDeclaration declaration = xml.CreateXmlDeclaration("1.0", "GB2312", "");//xml檔案的宣告部分
xml.AppendChild(declaration);
XmlElement xeRoot = xml.CreateElement("root");//創建一個<thumb>節點
xml.AppendChild(xeRoot);
}
else
xml.Load(fileName);
XmlNode xnRoot = xml.SelectSingleNode("//root");
XmlElement xeSub = xml.CreateElement("item");
xeSub.SetAttribute("ID", token);
xeSub.SetAttribute("loginName", loginName);
xml.Save(fileName);
}
catch(Exception ex)
{
throw ex;
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
uj5u.com熱心網友回復:
首先 我們一般把session保存到服務中 而不是行程中.mode="StateSetver" 并且開啟asp.net_state服務.
其次..就算你用InProc 也不會出現session馬上丟的問題.
所以 你這2次請求 是一個會話嗎?
uj5u.com熱心網友回復:
根據大然然道德帝最高指示,我們無法對你提問做出任何猜測性建議,因為這無疑懷疑你為弱智,屬于欺負新人,教訓新人的典型回復所以我們無法告訴你,是否應該先檢查檔案目錄是否具有寫入權限。
我們也無法告訴你
string fileName= string.Format(@"{0}bin\outerFile", AppDomain.CurrentDomain.BaseDirectory.ToString());
此代碼實際可能會有問題,因為這是懷疑你小學沒畢業,不知道網站專案的實際運行目錄為系統盤的asp.net temp目錄,直接給物理路徑也有可能超出web服務器的權限管理范圍
uj5u.com熱心網友回復:
根據大然然道德帝最高指示1.我們無法告訴你,路徑問題
2.我們無法告訴你
根據除錯, if (context.Session!=null&& context.Session[token]!=null)此處有問題,實際session有值,這無疑是懷疑新人根本不會下斷點除錯
3.我們無法告訴你,不建議使用文本。因為文本并發讀寫并好操作,請換用mssql資料庫或redis來保存session,這無疑是懷疑新人根本沒有能力處理文本并發問題
uj5u.com熱心網友回復:
根據大然然道德帝最高指示1.我們無法告訴你,根據測驗,session有值,存的就是null,因為你設定存loginname,但上面context.Request["loginName"];并未保證他不是null(根據大然然道德帝的道德標準,此處為嚴重鄙視新人不測驗,不寫斷言)
uj5u.com熱心網友回復:
context.Session!=null&& context.Session[token]!=null 暈。你檔案寫到bin目錄里了?暈,快點換掉。寫到站點目錄以外吧。
uj5u.com熱心網友回復:
這種情況若使用HttpRuntime.Cache或者static同樣存在此問題 。你都發現這樣的結果了,要自已分析啊,什么情況下Cache,static會丟失值?你首先想到的就是應用程式重啟,那么應用程式什么時候會被重啟?除了手動重啟iis等情況,還有什么?。。。。uj5u.com熱心網友回復:
<sessionState mode="InProc" timeout="1800"></sessionState>或者說你修改這里的配置,存別的地方去3. InProc模式(預設模式)
<sessionState mode="InProc" cookieless="false" timeout="20"></sessionState>
mode設定為"InProc"時,Session直接存盤在IIS行程中,你應用程式如果重啟,當然會丟失。
uj5u.com熱心網友回復:
其實 session 的丟失不外乎兩種情況,一種是設定的和讀取的,不是一個網站的 session,也就是不在一個應用程式池里面,還有一種更常見的就是應用程式池發生了回收。控制應用程式池的回收,并不是在 web.config 里面做了設定就足夠的,還要在 iis 里面做兩個必要的設定:http://bibaoke.com/post/66
uj5u.com熱心網友回復:
你這種情況就是改變 bin 目錄的檔案導致站點重啟了。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/49608.html
標籤:ASP.NET
