Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье объясняется, как обрабатывать события Web PubSub в Функциях Azure.
Web PubSub — это управляемая служба Azure, которая помогает разработчикам без труда создавать веб-приложения с функциями, работающими в реальном времени, и схемой "публикация-подписка".
| Действие | Тип |
|---|---|
| Запуск функции при поступлении сообщений из службы | Привязка триггера |
| Привязка запроса к целевому объекту в триггере HTTP для согласования и вышестоящих запросов | Входная привязка |
| Вызов службы для выполнения действий | Выходная привязка |
Исходный код | Пакет | Справочная документация по API | Документация по продукту | Примеры
Добавьте в ваше приложение-функцию
Для работы с триггером и привязками требуется ссылка на соответствующий пакет. Пакет NuGet используется для библиотек классов .NET, а пакет расширений используется для всех других типов приложений.
| Язык | Добавить с помощью... |
|---|---|
| C# | Установите пакет NuGet, выберите конкретную версию. |
| Скрипт JavaScript, Python, PowerShell, C# (только на портале Azure) | Использование пакетов расширений (рекомендуется), явно устанавливайте расширения |
Основные понятия
(1)–(2) Входная привязка WebPubSubConnection с HttpTrigger для создания клиентского соединения.
(3)–(4) Привязка триггера WebPubSubTrigger или привязка ввода WebPubSubContext к HttpTrigger для обработки сервисного запроса.
(5)–(6) Выходная привязка WebPubSub отправляет службе запрос на какое-то действие.
Привязка триггера
Воспользуйтесь триггером функции для обработки запросов из службы Azure Web PubSub.
WebPubSubTrigger используется для обработки запросов со стороны службы. Шаблон конечной точки триггера будет выглядеть следующим образом, его необходимо задать на стороне службы Web PubSub (портал: параметры —> обработчик событий —> шаблон URL-адреса). В шаблоне конечной точки часть запроса code=<API_KEY>НЕОБХОДИМА, если вы используете приложение-функцию Azure по соображениям безопасности. Ключ можно найти в портал Azure. Найдите ресурс вашего приложения-функции и перейдите в разделы Функции ->Ключи приложения ->Системные ключи ->webpubsub_extension после развертывания приложения-функции в Azure. Однако этот ключ не нужен при работе с локальными функциями.
<Function_App_Url>/runtime/webhooks/webpubsub?code=<API_KEY>
Пример
[FunctionName("WebPubSubTrigger")]
public static void Run(
[WebPubSubTrigger("<hub>", WebPubSubEventType.User, "message")] UserEventRequest request, ILogger log)
{
log.LogInformation($"Request from: {request.ConnectionContext.UserId}");
log.LogInformation($"Request message data: {request.Data}");
log.LogInformation($"Request message dataType: {request.DataType}");
}
WebPubSubTrigger привязка также поддерживает возвращаемое значение в синхронизированных сценариях, например события системы Connect и пользователя, когда сервер может проверять и отклонять запрос клиента или отправлять сообщения вызывающей программе напрямую.
Connectсобытия соблюдают ConnectEventResponse и EventErrorResponse, а пользовательские события соблюдают UserEventResponse и EventErrorResponse, остальные типы, не соответствующие текущему сценарию, игнорируются. Если возвращается EventErrorResponse, служба разрывает клиентское подключение.
[FunctionName("WebPubSubTriggerReturnValueFunction")]
public static UserEventResponse Run(
[WebPubSubTrigger("hub", WebPubSubEventType.User, "message")] UserEventRequest request)
{
return request.CreateResponse(BinaryData.FromString("ack"), WebPubSubDataType.Text);
}
Атрибуты и заметки
В библиотеках классов C# используйте атрибут WebPubSubTrigger.
Вот как выглядит атрибут WebPubSubTrigger в сигнатуре метода:
[FunctionName("WebPubSubTrigger")]
public static void Run([WebPubSubTrigger("<hub>", <WebPubSubEventType>, "<event-name>")]
WebPubSubConnectionContext context, ILogger log)
{
...
}
Полный пример см. в разделе Пример C#.
Настройка
В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.
| Свойство function.json | Свойство атрибута | Описание |
|---|---|---|
| тип | Н/Д | Обязательное. Необходимо задать значение webPubSubTrigger. |
| направление | Н/Д | Обязательное. Необходимо задать значение in. |
| имя | Н/Д | Обязательное. Имя переменной, используемой в коде функции, для параметра, получающего данные события. |
| втулка | Узел | Обязательно: в качестве значения следует указать имя концентратора Web PubSub для активируемой функции. Мы поддерживаем установку значения атрибута с высоким приоритетом, или это может быть задано в настройках приложения как глобальное значение. |
| eventType | WebPubSubEventType | Обязательно: в качестве значения следует указать тип события сообщений для активируемой функции. Значение должно быть user или system. |
| eventName | Название события | Обязательно: в качестве значения следует указать событие сообщений для активируемой функции.
Для system типа события имя события должно находиться в connect, connecteddisconnected.
Для определяемых пользователем подпротоколов используется messageимя события.
Для поддерживаемого системой подпротокола json.webpubsub.azure.v1.имя события — это имя события, определяемое пользователем. |
| Подключение | Подключение | Необязательно — имя настроек или коллекции настроек приложения, указывающее на вышестоящую службу Azure Web PubSub. Значение используется для проверки подписи. Значение автоматически устанавливается с помощью параметра приложения "WebPubSubConnectionString" по умолчанию. И null означает, что проверка не требуется и всегда выполняется успешно. |
Применение
В C# WebPubSubEventRequest — распознаваемый по типу параметр привязки; остальные параметры привязываются по имени. Доступные параметры и типы см. в таблице ниже.
В слабо типизированном языке, таком как JavaScript, name используется в function.json для привязки объекта триггера в соответствии с приведенной ниже сопоставительной таблицей. И соблюдение dataType в function.json, чтобы преобразовать сообщение соответствующим образом, когда name установлено как data для объекта привязки входных данных триггера. Все параметры можно считывать из context.bindingData.<BindingName> и преобразовывать с помощью JObject.
| Имя привязки | Тип привязки | Описание | Свойства |
|---|---|---|---|
| запрос | WebPubSubEventRequest |
Описание вышестоящего запроса | Свойство отличается различными типами событий, включая производные классыConnectEventRequest, ConnectedEventRequestUserEventRequest иDisconnectedEventRequest |
| Контекст подключения | WebPubSubConnectionContext |
Стандартные сведения о запросе | Тип события, Название события, Хаб, Идентификатор соединения, Идентификатор пользователя, Заголовки, Источник, Подпись, Состояния |
| данные |
BinaryData,string,,Streambyte[] |
Запрос данных сообщения от клиента в событии пользователя message |
- |
| тип данных | WebPubSubDataType |
Запрос сообщения типа данных dataType, который поддерживает binary, text, json |
- |
| требования | IDictionary<string, string[]> |
Требования пользователей в системном connect запросе |
- |
| запрос | IDictionary<string, string[]> |
Запрос пользователя в системном connect запросе |
- |
| субпротоколы | IList<string> |
Доступные подпротоколы в системном connect запросе |
- |
| сертификаты клиента | IList<ClientCertificate> |
Список отпечатков сертификатов от клиентов в системном connect запросе |
- |
| причина | string |
Причина в системном disconnected запросе |
- |
Внимание
В C# параметр, поддерживающий несколько типов, ДОЛЖЕН быть помещен первым, т.е. requestdata, отличным от типа по умолчанию BinaryData, чтобы функция связывалась корректно.
Возвращаемый ответ
WebPubSubTrigger уважает ответ, возвращенный клиентом, для синхронных событий connect и событий пользователя. Только соответствующий ответ отправляется обратно в службу, в противном случае он игнорируется. Кроме того, возвращаемый объект WebPubSubTrigger поддерживает пользователей в SetState() и ClearStates() управления метаданными подключения. И расширение объединяет результаты из возвращаемого значения с исходными из запроса WebPubSubConnectionContext.States. Значение в существующем ключе перезаписывается и добавляется значение в новом ключе.
| Тип возвращаемых данных | Описание | Свойства |
|---|---|---|
ConnectEventResponse |
Ответ на событие connect |
Группы, роли, UserId, Subprotocol |
UserEventResponse |
Ответ на событие пользователя | Тип данных, Данные |
EventErrorResponse |
Ответ с ошибкой для события синхронизации | Код, Сообщение об ошибке |
*WebPubSubEventResponse |
Базовый тип ответа из поддерживаемых используется для неопределенных сценариев возврата. | - |
Связывание входных данных
Наше расширение предлагает две привязки входных данных для различных потребностей.
WebPubSubConnectionПрежде чем клиент сможет подключиться к службе Azure Web PubSub, ему необходимо получить URL-адрес конечной точки службы и действительный маркер доступа. Входная привязка
WebPubSubConnectionсоздает необходимую информацию, поэтому клиенту не нужно самостоятельно создавать этот маркер. Так как маркер ограничен по времени и может использоваться для идентификации конкретного пользователя при подключении, не следует его кэшировать или передавать в совместное пользование клиентами. Триггер HTTP, работающий с этой входной привязкой, позволяет клиенту получить сведения о соединении.WebPubSubContextПри использовании в статических веб-приложениях
HttpTrigger— единственный поддерживаемый триггер, и в рамках сценария Web PubSub мы предоставляем входную привязкуWebPubSubContext, которая позволяет пользователям десериализовать вышестоящий HTTP-запрос со стороны службы согласно протоколам Web PubSub. Таким образом, клиенты могут получить аналогичные результаты, сравнимые сWebPubSubTrigger, что позволяет легко управлять в функциях. См. примеры ниже. При использовании сHttpTriggerклиентом необходимо настроить предоставленный URL-адрес HttpTrigger в обработчике событий соответствующим образом.
Пример- WebPubSubConnection
В следующем примере показана функция C#, получающая сведения о подключении Web PubSub с помощью входной привязки и возвращающая их по протоколу HTTP. В приведенном ниже примере передается UserId через часть запроса клиента, например ?userid={User-A}.
[FunctionName("WebPubSubConnectionInputBinding")]
public static WebPubSubConnection Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSubConnection(Hub = "<hub>", UserId = "{query.userid}")] WebPubSubConnection connection)
{
return connection;
}
Проверенные токены
Если функцию вызывает аутентифицированный клиент, вы можете добавить утверждение с идентификатором пользователя для созданного токена. Вы можете легко добавить аутентификацию к приложению-функции с помощью аутентификации Службы приложений.
Аутентификация службы приложений задает заголовки HTTP x-ms-client-principal-id и x-ms-client-principal-name, которые содержат идентификатор и имя субъекта клиента аутентифицированного пользователя соответственно.
Свойству UserId в привязке можно присвоить значение из одного из заголовков с помощью выражения привязки: {headers.x-ms-client-principal-id} или {headers.x-ms-client-principal-name}.
[FunctionName("WebPubSubConnectionInputBinding")]
public static WebPubSubConnection Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSubConnection(Hub = "<hub>", UserId = "{headers.x-ms-client-principal-name}")] WebPubSubConnection connection)
{
return connection;
}
Примечание.
Ограничения типов параметров привязки не позволяют передавать списки или массивы, WebPubSubConnection не полностью совместим со всеми параметрами, которые поддерживает серверный SDK, особенно с roles, а также включает groups и expiresAfter. В случае, если клиенту необходимо добавить роли или отложить создание токена доступа в функции, рекомендуется работать с серверным SDK для C#.
[FunctionName("WebPubSubConnectionCustomRoles")]
public static async Task<Uri> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
{
var serviceClient = new WebPubSubServiceClient(new Uri(endpoint), "<hub>", "<web-pubsub-connection-string>");
var userId = req.Query["userid"].FirstOrDefault();
// your method to get custom roles.
var roles = GetRoles(userId);
return await serviceClient.GetClientAccessUriAsync(TimeSpan.FromMinutes(5), userId, roles);
}
Пример- WebPubSubContext
В следующем примере показана функция C#, которая получает данные вышестоящего запроса Web PubSub с помощью входной привязки в connect типе события и возвращает ее по протоколу HTTP.
[FunctionName("WebPubSubContextInputBinding")]
public static object Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSubContext] WebPubSubContext wpsContext)
{
// in the case request is a preflight or invalid, directly return prebuild response by extension.
if (wpsContext.IsPreflight || wpsContext.HasError)
{
return wpsContext.Response;
}
var request = wpsContext.Request as ConnectEventRequest;
var response = new ConnectEventResponse
{
UserId = wpsContext.Request.ConnectionContext.UserId
};
return response;
}
Настройка
WebPubSubConnection
В следующей таблице описываются свойства конфигурации привязки, заданные в файле function.json и атрибуте WebPubSubConnection .
| Свойство function.json | Свойство атрибута | Описание |
|---|---|---|
| тип | Н/Д | Нужно задать значение webPubSubConnection |
| направление | Н/Д | Нужно задать значение in |
| имя | Н/Д | Имя переменной, используемой в коде функции для объекта входной привязки подключения. |
| втулка | Узел | Обязательно. Для активации функции необходимо задать имя концентратора Web PubSub. Мы поддерживаем установку значения атрибута с высоким приоритетом, или это может быть задано в настройках приложения как глобальное значение. |
| userId | UserId | Необязательно: значение утверждения идентификатора пользователя, которое следует задать в токене ключа доступа. |
| Подключение | Подключение | Обязательный параметр — имя параметра приложения, содержащего строку подключения службы Web PubSub (по умолчанию — WebPubSubConnectionString). |
WebPubSubContext
В таблице ниже описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте WebPubSubContext.
| Свойство function.json | Свойство атрибута | Описание |
|---|---|---|
| тип | Н/Д | Должен иметь значениеwebPubSubContext. |
| направление | Н/Д | Должен иметь значениеin. |
| имя | Н/Д | Имя переменной, используемое в коде функции для входного запроса Web PubSub. |
| Подключение | Подключение | Необязательно — имя настроек или коллекции настроек приложения, указывающее на вышестоящую службу Azure Web PubSub. Это значение используется для проверки защиты от злоупотреблений и подписи. Значение по умолчанию автоматически определяется как "WebPubSubConnectionString". И null означает, что проверка не требуется и всегда выполняется успешно. |
Использование
WebPubSubConnection
WebPubSubConnection предоставляет указанные ниже свойства.
| Имя привязки | Тип привязки | Описание |
|---|---|---|
| BaseUri | URI | URI подключения клиента Web PubSub. |
| URI | URI | Абсолютный URI подключения Web PubSub содержит AccessToken сгенерированную основу на основании запроса. |
| AccessToken | строка | Создано AccessToken на основе ID пользователя и информации о службе. |
WebPubSubContext
WebPubSubContext предоставляет указанные ниже свойства.
| Имя привязки | Тип привязки | Описание | Свойства |
|---|---|---|---|
| запрос | WebPubSubEventRequest |
Запрос от клиента, смотрите таблицу ниже для деталей. |
WebPubSubConnectionContext из заголовка запроса и других свойств, десериализованных из тела запроса, описывают запрос, например Reason для DisconnectedEventRequest запроса. |
| Отклик | HttpResponseMessage |
Расширение создает ответ в основном для AbuseProtection и в случае ошибок. |
- |
| сообщение об ошибке | строка | Описание сведений об ошибке при обработке вышестоящего запроса. | - |
| ЕстьОшибка | булевая переменная (bool) | Флаг, указывающий, является ли это допустимым запросом для Web PubSub. | - |
| isPreflight | булевая переменная (bool) | Флаг, указывающий, является ли это предварительным запросом AbuseProtection. |
- |
Для WebPubSubEventRequest оно десериализуется в разные классы, предоставляющие различную информацию о сценарии запроса. Для PreflightRequest или недействительных случаев, пользователь может проверить флаги IsPreflight и HasError, чтобы узнать. Предлагается вернуть ответ WebPubSubContext.Response на сборку системы напрямую, или клиент может логировать ошибки по запросу. В различных сценариях клиент может считывать свойства запроса, как показано ниже.
| Производный класс | Описание | Свойства |
|---|---|---|
PreflightRequest |
Используется в AbuseProtection том случае, если IsPreflight равно true |
- |
ConnectEventRequest |
Используется в системном Connect типе событий |
Утверждения, запрос, подпротоколы, ClientCertificates |
ConnectedEventRequest |
Используется в системном Connected типе событий |
- |
UserEventRequest |
Используется в пользовательском типе события | Данные, Тип данных |
DisconnectedEventRequest |
Используется в системном Disconnected типе событий |
Причина |
Примечание.
WebPubSubContext Хотя это входная привязка, которая предоставляет аналогичный метод десериализации запросов по HttpTrigger сравнению с WebPubSubTrigger, есть ограничения. То есть состояние подключения после слияния не поддерживается. Ответ по-прежнему учитывается стороной службы, но пользователям нужно создать его самостоятельно. Если у пользователей есть необходимость задать ответ на событие, вы должны вернуть HttpResponseMessage, содержащий ConnectEventResponse, или сообщения для пользовательского события в качестве тела ответа и поместить состояние подключения с ключом ce-connectionstate в заголовок ответа.
Выходные привязки
Используйте выходную привязку Web PubSub, чтобы вызвать службу Azure Web PubSub, чтобы сделать что-то. Сообщение можно транслировать следующим получателям:
- Все подключенные клиенты
- Подключенные клиенты, аутентифицированные для конкретного пользователя.
- Подключенные клиенты, присоединенные к определенной группе
- Определенное подключение клиента
Выходная привязка также позволяет управлять клиентами и группами, а также предоставлять или отзывать разрешения, нацеленные на конкретный connectionId в группе.
- Добавление подключения к группе
- Добавление пользователя в группу
- Удалить подключение из группы
- Удаление пользователя из группы
- Удаление пользователя из всех групп.
- Закройте все клиентские подключения
- Закрытие определенного подключения клиента
- Закрытие подключений в группе
- Предоставление разрешения на подключение
- Отмена разрешения подключения
Сведения об установке и настройке см. в обзорной статье.
Пример
[FunctionName("WebPubSubOutputBinding")]
public static async Task RunAsync(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req,
[WebPubSub(Hub = "<hub>")] IAsyncCollector<WebPubSubAction> actions)
{
await actions.AddAsync(WebPubSubAction.CreateSendToAllAction("Hello Web PubSub!", WebPubSubDataType.Text));
}
WebPubSubAction
WebPubSubAction — базовый абстрактный тип выходных привязок. Производные типы представляют сервер действий, который требуется вызвать службой.
На языке C# мы предоставляем несколько статических методов WebPubSubAction для обнаружения доступных действий. Например, пользователь может создать SendToAllAction, вызвав WebPubSubAction.CreateSendToAllAction().
| Производный класс | Свойства |
|---|---|
SendToAllAction |
Данные, DataType, исключенные |
SendToGroupAction |
Группа, данные, DataType, исключенные |
SendToUserAction |
Идентификатор пользователя, Данные, Тип данных |
SendToConnectionAction |
Идентификатор подключения, Данные, Тип данных |
AddUserToGroupAction |
Идентификатор пользователя, Группа |
RemoveUserFromGroupAction |
Идентификатор пользователя, Группа |
RemoveUserFromAllGroupsAction |
UserId |
AddConnectionToGroupAction |
Идентификатор подключения, Группа |
RemoveConnectionFromGroupAction |
Идентификатор подключения, Группа |
CloseAllConnectionsAction |
Исключены, причина |
CloseClientConnectionAction |
Идентификатор соединения, Причина |
CloseGroupConnectionsAction |
Группа, исключенная, причина |
GrantPermissionAction |
ИдентификаторСоединения, Разрешение, ИмяЦели |
RevokePermissionAction |
ИдентификаторСоединения, Разрешение, ИмяЦели |
Настройка
WebPubSub
В следующей таблице описываются свойства конфигурации привязки, заданные в файле function.json и атрибуте WebPubSub .
| Свойство function.json | Свойство атрибута | Описание |
|---|---|---|
| тип | Н/Д | Нужно задать значение webPubSub |
| направление | Н/Д | Нужно задать значение out |
| имя | Н/Д | Имя переменной, используемой в коде функции для выходной привязки объекта. |
| втулка | Узел | В качестве значения следует указать имя концентратора Web PubSub, чтобы функция была активирована. Мы поддерживаем установку значения атрибута с высоким приоритетом, или это может быть задано в настройках приложения как глобальное значение. |
| Подключение | Подключение | Имя параметра приложения, содержащего строку подключения службы Web PubSub (по умолчанию — WebPubSubConnectionString). |
Устранение неполадок
Настройка ведения журнала консоли
Можно легко включить ведение журнала консоли, если вы хотите получить более подробную информацию о запросах к службе.
Следующие шаги
Используйте эти ресурсы для начала создания собственного приложения: