我在我的网站上聊天功能,我每隔10秒就使用一次Ajax帖子来调用WebMethod刷新在线用户列表,这就是为什么会话不会因为每10秒后发布一次Ajax而超时。我应该如何使用ajax post处理会话超时?
<sessionState mode="InProc" timeout="15"/>
<authentication mode="Forms">
<forms name="PakistanLawyersLogin" loginUrl="Login.aspx"
timeout="14" slidingExpiration="false"/>
</authentication>
这是WebMethod,每10秒后调用一次,以获取在线用户列表。
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string getContactList(object userID) {
string respuesta = "";
try {
int _userID = Convert.ToInt16(userID);
DCDataContext dc = new DCDataContext();
DateTime allowTime = DateTime.Now.AddMinutes(-1);
//DateTime allowTime = DateTime.Now.AddDays(-5); //esto lo uso para hacer pruebas
var onlineUsers = from d in dc.Chat_usuarios where d.lastPop > allowTime && d.id != _userID select d;
JObject Opacientes = new JObject(
new JProperty("onlineUsers",
new JObject(
new JProperty("count", onlineUsers.Count()),
new JProperty("items",
new JArray(
from p in onlineUsers
orderby p.userName
select new JObject(
new JProperty("id", p.id),
new JProperty("userName", p.userName.Trim())
))))));
respuesta= Opacientes.ToString();
}
catch { respuesta = "error"; }
return respuesta;
}
答案 0 :(得分:2)
如果我理解正确,您希望用户的会话因不活动而超时,但常量轮询会使会话保持活动状态。您知道要使用哪些标准来确定用户是否处于非活动状态吗?
您可以做的一件事是将“LastUserInput”DateTime存储为单独的会话变量。将用户输入数据的时间推迟到聊天中,更新此变量。然后,在每个请求中,通过比较DateTime.Now - Session [“LastUserInput”]来获取TimeSpan,如果经过的时间是> = =你想要的TimeOut,你可以以编程方式杀死他们的会话。
已更新以提供代码示例
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string getContactList(object userID)
{
CheckUserInputTimeout();
string respuesta = "";
try
{
//your code
}
catch { respuesta = "error"; }
return respuesta;
}
private void ResetUserInputTimeout()
{
//Call this function from wherever you want to accept user input as a valid indicator that the user is still active
Session["LastUserInput"] = DateTime.Now;
}
private void CheckUserInputTimeout()
{
int iTimeoutInMinutes = 15;
DateTime dtLastUserInput = DateTime.Now;
if (Session["LastUserInput"] != null)
dtLastUserInput = (DateTime)Session["LastUserInput"];
TimeSpan tsElapsedTime = new TimeSpan(DateTime.Now.Ticks - dtLastUserInput.Ticks);
if (tsElapsedTime.TotalMinutes >= iTimeoutInMinutes)
Session.Abaondon();
}