Есть ли способ реализовать события в SignalR Core Hub?

На самом деле это просто с такой функцией, как следующая. Он использует имя таблицы базы данных «сеансы» с полями «id» и «time».

Каждый раз, когда пользователь снова посещает ваш сайт или службу, вы должны вызвать эту функцию, чтобы проверить, имеет ли ее возвращаемое значение TRUE. Если это FALSE, пользователь истек, и сеанс будет уничтожен (Примечание. Эта функция использует класс базы данных для подключения и запроса базы данных, конечно, вы также можете сделать это внутри своей функции или что-то в этом роде):

function session_timeout_ok() {
    global $db;
    $timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
    $ok = false;
    $session_id = session_id();
    $sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
    $rows = $db->query($sql);
    if ($rows === false) {
        //Timestamp could not be read
        $ok = FALSE;
    }
    else {
        //Timestamp was read succesfully
        if (count($rows) > 0) {
            $zeile = $rows[0];
            $time_past = $zeile['time'];
            if ( $timeout + $time_past < time() ) {
                //Time has expired
                session_destroy();
                $sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
                $affected = $db -> query($sql);
                $ok = FALSE;
            }
            else {
                //Time is okay
                $ok = TRUE;
                $sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
                $erg = $db -> query($sql);
                if ($erg == false) {
                    //DB error
                }
            }
        }
        else {
            //Session is new, write it to database table sessions
            $sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
            $res = $db->query($sql);
            if ($res === FALSE) {
                //Database error
                $ok = false;
            }
            $ok = true;
        }
        return $ok;
    }
    return $ok;
}
1
задан Sam 18 March 2019 в 12:36
поделиться

1 ответ

Измените ваше TimerCouldNotBeStarted событие на сервис, который вы добавили в DI. Затем разрешите службу в конструкторе Hubs и используйте ее в своих методах.

public class TimerHub : Hub
{
    private readonly TimeService _timer;

    public TimerHub(TimerService timer)
    {
        _timer = timer;
    }

    Task TimerStatusUpdate(string message)
    {
        switch (message)
        {
            case "Timer could not be started.":
                _timer.OnTimerCouldNotBeStarted(EventArgs.Empty); // Raise event
                break;
        }

        return Clients.All.SendAsync("EditionStatusUpdate", message);
    }
}
0
ответ дан Brennan 18 March 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: