Пример использования Derivative Webhook и SignalR (.NET)
В апреле 2018 года был представлен derivative webhook (прим. переводчика: возможность подписки на событие extraction.finished, т.е. уведомления Вашего приложения о том, что преобразование модели с помощью Model Derivative API завершено). Чуть позже мы представили .NET SDK и пример кода (прим. переводчика: см. перевод на нашем сайте: Derivative Webhooks .NET SDK) . В этой статье мы предоставляем Вашему вниманию более полный пример использования этого механизма.
В этом примере мы будем использовать SignalR для того, чтобы уведомлять браузерный клиент о завершении процесса преобразования модели. Информация об использовании SignalR доступна в интернете, мне, например, нравится это видео.
Для использования SignalR требуется:
1. В видео по ссылке выше используется пакет NPM, но для простоты мне больше нравится использовать CDN. Используем библиотеку SignalR для подключения к серверу и обработки сообщений от него:
2. Hub на стороне сервера для управления соединением и отправки сообщений. Нам нужен способ для получения уникального id клиент-серверного соединения. Я использую connectionId, получаемый при вызове метода ModelDerivativeHub.GetConnectionId() из Hub-а в клиентском коде. Этот id уникален и однозначно идентифицирует браузерный клиент, которому и будет отправляться сообщение при вызове метода ModelDerivativeHub.ExtractionFinished.
На клиентской стороне мы получаем connectionId следующим образом:
- ...
- if (connection && connection.connectionState) { if (onReady) onReady(); return; }
- connection = new signalR.HubConnectionBuilder().withUrl("/api/signalr/modelderivative").build();
- connection.start()
- .then(function () {
- connection.invoke('getConnectionId')
- .then(function (id) {
- connectionId = id; // здесь сохраняем полученный id
- if (onReady) onReady();
- });
- });
- ...
Код ModelDerivativeHub:
- public class ModelDerivativeHub : Microsoft.AspNetCore.SignalR.Hub
- {
- public string GetConnectionId() { return Context.ConnectionId; }
- public async static Task ExtractionFinished(IHubContext<ModelDerivativeHub> context, JObject body)
- {
- string connectionId = body["hook"]["scope"]["workflow"].Value<String>();
- await context.Clients.Client(connectionId).SendAsync("extractionFinished", body);
- }
- }
Обработка extractionFinished на клиентской стороне:
- connection.on("extractionFinished", function (data) {
- launchViewer(data.resourceUrn);
- });
Коммит на GitHub со всеми изменениями, связанными с подключением SignalR.
Пример доступен по адресу modelderivative.herokuapp.com
Источник: https://forge.autodesk.com/blog/derivative-webhook-signalr-net
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 10.01.2019