Поделиться через


Привязка триггера Службы SignalR для службы "Функции Azure"

Используйте привязку триггера SignalR для реагирования на сообщения, отправляемые из Службы Azure SignalR. При запуске функции сообщения, передаваемые в функцию, анализируются как объект JSON.

В бессерверном режиме Служба SignalR использует для отправки сообщений из клиента в приложение-функцию возможность отправки данных в вышестоящий ресурс. При этом приложение-функция использует для обработки этих сообщений привязку триггера Службы SignalR. Стандартная архитектура показана ниже.

Архитектура триггера SignalR

Сведения об установке и настройке см. в обзорной статье.

Пример

Функцию C# можно создать с помощью одного из следующих режимов C#:

  • Изолированная рабочая модель: скомпилированная функция C#, которая выполняется в рабочем процессе, изолированном от среды выполнения. Изолированный рабочий процесс необходим для поддержки функций C#, работающих в LTS и не LTS-версиях .NET и платформа .NET Framework.
  • Модель внутрипроцессного процесса: скомпилированная функция C#, которая выполняется в том же процессе, что и среда выполнения Функций.
  • Скрипт C#: используется в основном при создании функций C# в портал Azure.

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

[Function(nameof(OnClientMessage))]
public static void OnClientMessage(
    [SignalRTrigger("Hub", "messages", "sendMessage", "content", ConnectionStringSetting = "SignalRConnection")]
        SignalRInvocationContext invocationContext, string content, FunctionContext functionContext)
{
    var logger = functionContext.GetLogger(nameof(OnClientMessage));
    logger.LogInformation("Connection {connectionId} sent a message. Message content: {content}", invocationContext.ConnectionId, content);
}

Внимание

Модель на основе классов Служба SignalR привязок в изолированной рабочей роли C# не оптимизирует способ записи триггеров SignalR из-за ограничения рабочей модели C#. Дополнительные сведения о модели на основе классов см. в разделе "Модель на основе классов".

Триггер SignalR в настоящее время не поддерживается для Java.

Данные привязки в файле function.json:

{
    "type": "signalRTrigger",
    "name": "invocation",
    "hubName": "hubName1",
    "category": "messages",
    "event": "SendMessage",
    "parameterNames": [
        "message"
    ],
    "direction": "in"
}
app.generic("function1",
    {
        trigger: { "type": "signalRTrigger", "name": "invocation", "direction": "in", "hubName": "hubName1", "event": "SendMessage", "category": "messages" },
        handler: (triggerInput, context) => {
            context.log(`Receive ${context.Arguments[0]} from ${triggerInput.ConnectionId}.`)
        }
    })

Скоро должны появиться полные примеры PowerShell.

Ниже приведен код Python.

import logging
import json
import azure.functions as func

def main(invocation) -> None:
    invocation_json = json.loads(invocation)
    logging.info("Receive {0} from {1}".format(invocation_json['Arguments'][0], invocation_json['ConnectionId']))

Атрибуты

Библиотеки C# в процессе и изолированном рабочем процессе используют SignalRTrigger атрибут для определения функции. Вместо этого в скрипте C# используется файл конфигурации function.json.

В следующей таблице описываются свойства атрибута SignalRTrigger.

Свойство атрибута Description
HubName В качестве значения следует указать имя концентратора SignalR для активируемой функции.
Категория В качестве значения следует указать категорию сообщений для активируемой функции. Категория может быть одним из следующих значений:
  • connections: включает в себя подключенные и отключенные события.
  • messages: включает в себя все остальные события, кроме тех, которые принадлежат к категории connections.
Событие В качестве значения следует указать событие сообщений для активируемой функции. Для категории messages событие является целевым в отправляемом клиентами сообщении о вызове. Для категории connections используется только подключенные и отключенные.
ParameterNames (Не обязательно.) Список имен, привязанных к параметрам.
ConnectionStringSetting Имя параметра приложения, который содержит строку подключения службы SignalR (по умолчанию используется AzureSignalRConnectionString).

Заметки

В настоящее время для триггера SignalR не поддерживается заметка Java.

Настройка

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

Свойство в function.json Описание
type Должен иметь значениеSignalRTrigger.
direction Должен иметь значениеin.
name Имя переменной, используемое в коде функции для объекта контекста вызова триггера.
hubName В качестве значения следует указать имя концентратора SignalR для активируемой функции.
category В качестве значения следует указать категорию сообщений для активируемой функции. Категория может быть одним из следующих значений:
  • connections: включает в себя подключенные и отключенные события.
  • messages: включает в себя все остальные события, кроме тех, которые принадлежат к категории connections.
event В качестве значения следует указать событие сообщений для активируемой функции. Для категории messages событие является целевым в отправляемом клиентами сообщении о вызове. Для категории connections используется только подключенные и отключенные.
parameterNames (Не обязательно.) Список имен, привязанных к параметрам.
connectionStringSetting Имя параметра приложения, который содержит строку подключения службы SignalR (по умолчанию используется AzureSignalRConnectionString).

Подробные примеры см. в разделе Примеры.

Использование

Полезные данные

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

InvocationContext

InvocationContext содержит все содержимое в сообщении, отправленном из службы SignalR, которая включает следующие свойства:

Свойство Description
Аргументы Доступно для категории messages. Содержит аргументы в сообщении о вызове
Ошибка Доступно для отключенного события. Может быть пустым, если соединение закрыто без ошибок, или содержать сообщения об ошибках.
Узел Имя концентратора, к которому принадлежит сообщение.
Категория Категория сообщения.
Мероприятие Событие сообщения.
ConnectionId Идентификатор подключения клиента, отправляющего сообщение.
UserId Удостоверение пользователя клиента, который отправляет сообщение.
Заголовки Заголовки запроса.
Query Требование запроса, когда клиенты подключаются к службе.
Претензии Утверждения клиента.

С использованием ParameterNames

Свойство ParameterNames в SignalRTrigger позволяет привязывать аргументы сообщений о вызове к параметрам функций. Определенное пользователем имя можно использовать в рамках выражений привязки в других привязках или как параметры в коде. Это предоставляет более удобный способ доступа к аргументам InvocationContext.

Предположим, у вас есть клиент SignalR для JavaScript, пытающийся вызвать метод broadcast в функции Azure с двумя аргументами message1 и message2.

await connection.invoke("broadcast", message1, message2);

После установки parameterNames заданные имена будут соответствовать аргументам, отправляемым на стороне клиента.

[SignalRTrigger(parameterNames: new string[] {"arg1, arg2"})]

arg1 Затем содержит содержимое message1и arg2 содержит содержимоеmessage2.

Рекомендации для ParameterNames

Для привязки параметра важен порядок. Если используется ParameterNames, порядок в ParameterNames совпадает с порядком аргументов, которые вызываются в клиенте. Если вы используете атрибут [SignalRParameter] в C#, порядок аргументов в методах функции Azure соответствует порядку аргументов в клиентах.

ParameterNames и атрибут [SignalRParameter] нельзя использовать одновременно или вы получите исключение.

Интеграция Службы SignalR

При использовании привязки триггера Службы SignalR этой службе требуется URL-адрес для доступа к приложению-функции. URL-адрес должен быть настроен стороне Службы SignalR в параметрах вышестоящего ресурса.

Портал вышестоящего ресурса

При использовании триггера Служба SignalR URL-адрес может быть простым и отформатированным следующим образом:

<Function_App_URL>/runtime/webhooks/signalr?code=<API_KEY>

Его Function_App_URL можно найти на странице обзора приложения-функции и API_KEY создается функцией Azure. API_KEY можно получить из signalr_extension в колонке Ключи приложения в приложении-функции. Ключ API

Если вы хотите использовать несколько приложений-функций вместе с одной Службой SignalR, вышестоящий ресурс может также поддерживать сложные правила маршрутизации. Дополнительные сведения см. в статье о параметрах отправки данных в вышестоящий ресурс.

Пошаговый пример

Вы можете развернуть комнату чата в приложении-функции с помощью привязки триггера Службы SignalR и возможности отправки данных в вышестоящий ресурс, воспользовавшись примером двунаправленного чата в GitHub.

Следующие шаги