Управление группами в службе SignalR в функции Azure - PullRequest
0 голосов
/ 16 октября 2019

Я реализовал конечную точку согласования и метод отправки и подключился от JS-клиента signalR. Я получаю соединение и могу транслировать сообщения всем подключенным клиентам. Согласно нашему требованию, я должен отправить сообщение нескольким клиентам. Из документации я считаю, что мы можем отправлять сообщения группе. Я написал функцию Azure для добавления и удаления пользователя в группу.

 [FunctionName("AddToGroup")]
        public static Task AddToGroup(
            [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req,
            ILogger log,
            [SignalR(HubName = NotificationConstants.Hub)]IAsyncCollector<SignalRGroupAction> signalRGroupActions)
        {
            string userId = req.Query[NotificationConstants.QueryStringUserId];
            string companyId = req.Query[NotificationConstants.QueryStringCompanyId];
            return signalRGroupActions.AddAsync(
                 new SignalRGroupAction
                 {
                     UserId = userId,
                     GroupName = string.Format(CultureInfo.CurrentCulture,
                                NotificationConstants.Group,
                                companyId),
                     Action = GroupAction.Add
                 });
        }

    [FunctionName("RemoveFromGroup")]
    public static Task removeFromGroup(
       [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req,
       ILogger log,
       [SignalR(HubName = NotificationConstants.Hub)]IAsyncCollector<SignalRGroupAction> signalRGroupActions)
    {
        string userId = req.Query[NotificationConstants.QueryStringUserId];
        string companyId = req.Query[NotificationConstants.QueryStringCompanyId];
        return signalRGroupActions.AddAsync(
             new SignalRGroupAction
             {
                 UserId = userId,
                 GroupName = string.Format(CultureInfo.CurrentCulture,
                            NotificationConstants.Group,
                            companyId),
                 Action = GroupAction.Remove
             });
    }

Как я могу позвонить из JS Client? Мой пример кода клиента, как показано ниже. Пожалуйста, предложите

function GetConnectionInfo() {
    return axios.get('http://localhost:7071/api/ConnectionInfo?UserId=1_2347')
        .then(function (response) {
            return response.data;
        }).catch(console.error);
}

function StartConnection(connection) {
    console.log('connecting...');
    connection.start()
        .then(function () {
            console.log('connected!');
            connection.invoke('getConnectionId')
                .then(function (connectionId) {
                    console.log(connectionId);
                    // Send the connectionId to controller
                });

        })
        .catch(function (err) {
            console.error(err);
            setTimeout(function () { StartConnection(connection); }, 2000);
        });
}

GetConnectionInfo().then(function (info) {
    let accessToken = info.accessToken;
    const options = {
        accessTokenFactory: function () {
            if (accessToken) {
                const _accessToken = accessToken;
                accessToken = null;
                return _accessToken;
            } else {
                return GetConnectionInfo().then(function (info) {
                    return info.accessToken;
                });
            }

        }
    };

    const connection = new signalR.HubConnectionBuilder()
        .withUrl(info.url, options)
        .build();
    StartConnection(connection);

    connection.on('DocumentStatusUpdated', ProcessDocumentData);

    connection.onclose(function () {
        console.log('disconnected');
        setTimeout(function () { StartConnection(connection); }, 5000);
    });
}).catch(console.error);

Может кто-нибудь, пожалуйста, направьте меня.

Спасибо

1 Ответ

0 голосов
/ 24 октября 2019

Исходя из кода, которым вы поделились, вам понадобятся userId и companyId пользователей, которых вы хотите добавить в свою группу, и простые вызовы axios.get() соответственно.

Для отправкисообщение конкретной группе, вам потребуется еще одна функция. Документ имеет образец кода для того же. Вот то же самое для ссылки

[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]object message,
    [SignalR(HubName = "chat")]IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            // the message will be sent to the group with this name
            GroupName = "myGroup",
            Target = "newMessage",
            Arguments = new [] { message }
        });
}

И вы бы сделали axios.post() вызов этой конечной точки, чтобы отправить сообщение группе, созданной ранее.

...