SignalR Dynamic HubName - PullRequest
       25

SignalR Dynamic HubName

0 голосов
/ 07 ноября 2018

Я использую функцию Azure для чтения сообщений из концентратора событий и отправки их в экземпляр SignalR. У меня есть интерфейс JavaScript, который подключен к экземпляру SignalR и получает сообщения. Я хочу, чтобы динамически установить атрибут «HubName» в моей базе функций Azure, исходя из переданного значения. Я включил свои вызовы функций Azure ниже. В обоих методах я хотел бы динамически установить значение HubName, которое жестко закодировано как «deviceMessages»

    public static SignalRConnectionInfo GetSignalRInfo(
        [HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req,
        [SignalRConnectionInfo(HubName = "deviceMessages")] SignalRConnectionInfo connectionInfo)
    {
        return connectionInfo;
    }


    public static Task SendMessage(
        [EventHubTrigger("{EventHubName}", Connection = "EventHubConnectionAppSetting")]string myEventHubMessage,
        [SignalR(HubName = "deviceMessages")] IAsyncCollector<SignalRMessage> signalRMessages)
    {
        return signalRMessages.AddAsync(
            new SignalRMessage
            {
                Target = "newMessage",
                Arguments = new[] { myEventHubMessage }
            });
    }

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я нашел отдельный способ обойти эту проблему, используя свойство UserId объекта SignalRConnectionInfo. Я передаю идентификатор устройства, для которого я хочу получать сообщения, в вызове «переговоры», используя поле настраиваемого заголовка, которое возвращает токен для этого идентификатора. Затем я устанавливаю это значение в объекте SignalRMessage при получении сообщения из концентратора событий. Таким образом, страница устройства, на которой я нахожусь, только получает сообщение, которое отправляет это конкретное устройство.

    [FunctionName("negotiate")]
    public static SignalRConnectionInfo GetSignalRInfo(
        [HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req,
        [SignalRConnectionInfo(HubName = "deviceMessages", UserId = "{headers.deviceId}")] SignalRConnectionInfo connectionInfo)
    {
        return connectionInfo;
    }

    [FunctionName("messages")]
    public static Task SendMessage(
        [EventHubTrigger("{EventHubName}", Connection = "EventHubConnectionAppSetting")]string myEventHubMessage,
        [SignalR(HubName = "deviceMessages")] IAsyncCollector<SignalRMessage> signalRMessages)
    {
        var dev = JToken.Parse(Convert.ToString(myEventHubMessage));
        DeviceMessage msg = dev.ToObject<DeviceMessage>();

        return signalRMessages.AddAsync(
            new SignalRMessage
            {
                UserId = msg.deviceId,
                Target = "newMessage",
                Arguments = new[] { myEventHubMessage }
            });
    }
0 голосов
/ 07 ноября 2018

Вы можете сделать привязку императивным способом. Используйте IBinder binder в подписи вашей функции, и вы можете создавать привязки во время выполнения.

var signalRAttribute = new SignalRAttribute(/* your settings here */));
var outputMessages = await binder.BindAsync<IAsyncCollector<SignalRMessage>>(signalRAttribute);

Здесь также есть хорошие образцы:

Как использовать Binder для выполнения динамических привязок в моей функции C #?

и здесь:

https://weblogs.asp.net/sfeldman/azure-functions-to-make-audit-queue-and-auditors-happy

...