Тайм-аут сеанса с сообщением ajax - PullRequest
0 голосов
/ 19 мая 2011

У меня есть функция чата на моем веб-сайте, и я использую сообщение Ajax через каждые 10 секунд для вызова WebMethod для обновления списка онлайн-пользователей, поэтому сеанс не прерывается из-за сообщения Ajax через каждые 10 секунд. Как мне обработать тайм-аут сеанса с постом ajax?

<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 Ответ

2 голосов
/ 19 мая 2011

Если я правильно понимаю, вы хотите, чтобы сеанс пользователя истек из-за неактивности, но постоянный опрос поддерживает сессию живой. Знаете ли вы, какие критерии вы хотите использовать, чтобы определить, что пользователь неактивен?

Одна вещь, которую вы могли бы сделать, это сохранить DateTime LastUserInput как отдельную переменную сеанса. Переведите время ввода данных пользователя в чат, обновите эту переменную. Затем при каждом запросе получайте TimeSpan, сравнивая DateTime.Now - Session ["LastUserInput"], и если истекшее время>>, чем бы вы не хотели, чтобы 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();
    }
...