Как показать текущее местоположение пользователя в SignalR?

Я создаю приложение для отслеживания местоположения пользователя для клиента.

Я получаю местоположение через клиент (Android), используя метод концентратора SignalR и сохраняя в MongoDb

Мой код

public async Task UpdateLocation(double latitude, double longitude)
{
    await _mediator.Send(new UpdateLocationRequestModel()
    {
        Latitude = latitude,
        Longitude = longitude,
        UserId = Context.User.GetUserId()
    });
}

Теперь я хочу, чтобы другой клиент (Интернет) просматривал обновления определенного пользователя в режиме реального времени.

Как я могу это сделать?

Мое теоретическое решение

Я думал о создании метода в концентраторе, когда клиент (Интернет) нажимает кнопку, метод будет вызываться

public async Task ShowUser(string userId)
{
    //Add To Redis Cache ('track',userId)         
}

public async Task UpdateLocation(double latitude, double longitude)
{
    await _mediator.Send(new UpdateLocationRequestModel()
    {
        Latitude = latitude,
        Longitude = longitude,
        UserId = Context.User.GetUserId()
    });
    // Check Redis Cahce for 'track'
    // Send Data to Client(Web)
}

Я не проверял это, но есть ли лучший способ?


person test noob    schedule 07.03.2020    source источник


Ответы (1)


Если вы используете только SignalR

Теоретический подход для вас без использования Redis будет таким. Предполагая, что вы хотите отслеживать только одного пользователя за раз

public async AddToTrackGroup(string userId) {
        return Groups.Add(Context.ConnectionId, "track-" + userId);
}

public async RemoveFromTrackGroup(string userId) {
        return Groups.Remove(Context.ConnectionId, "track-" + userId);
}

public async Task UpdateLocation(double latitude, double longitude)
{
    await _mediator.Send(new UpdateLocationRequestModel()
    {
        Latitude = latitude,
        Longitude = longitude,
        UserId = Context.User.GetUserId()
    });
    Clients.Group("track-" + Context.User.GetUserId()).updateLocation(latitude,longitude);
}

Теоретически это даст вам доступ к местоположению клиентов, поскольку для этого пользователя отслеживания существует группа, а также несколько клиентов также могут отслеживать этого пользователя.

Я не проверял это, но это может сработать.

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

Как я считаю, это может помочь другим пользователям.

person Noob Coder    schedule 09.03.2020