ajax帖子的会话超时问题

时间:2011-05-19 13:41:23

标签: asp.net session-timeout webmethod

我在我的网站上聊天功能,我每隔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;            
    }

1 个答案:

答案 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();
    }