ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/01/2019

Пример использования 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 для подключения к серверу и обработки сообщений от него:

Код - HTML: [Выделить]
  1. <script src="//unpkg.com/@aspnet/signalr@1.1.0/dist/browser/signalr.min.js"></script>

2. Hub на стороне сервера для управления соединением и отправки сообщений. Нам нужен способ для получения уникального id клиент-серверного соединения. Я использую connectionId, получаемый при вызове метода ModelDerivativeHub.GetConnectionId() из Hub-а в клиентском коде. Этот id уникален и однозначно идентифицирует браузерный клиент, которому и будет отправляться сообщение при вызове метода ModelDerivativeHub.ExtractionFinished.

На клиентской стороне мы получаем connectionId следующим образом:

Код - JavaScript: [Выделить]
  1. ...
  2. if (connection && connection.connectionState) { if (onReady) onReady(); return; }
  3. connection = new signalR.HubConnectionBuilder().withUrl("/api/signalr/modelderivative").build();
  4. connection.start()
  5.   .then(function () {
  6.     connection.invoke('getConnectionId')
  7.       .then(function (id) {
  8.         connectionId = id; // здесь сохраняем полученный id
  9.         if (onReady) onReady();
  10.       });
  11. });
  12. ...

Код ModelDerivativeHub:

Код - C#: [Выделить]
  1. public class ModelDerivativeHub : Microsoft.AspNetCore.SignalR.Hub
  2. {
  3.     public string GetConnectionId() { return Context.ConnectionId; }
  4.  
  5.     public async static Task ExtractionFinished(IHubContext<ModelDerivativeHub> context, JObject body)
  6.     {
  7.         string connectionId = body["hook"]["scope"]["workflow"].Value<String>();
  8.         await context.Clients.Client(connectionId).SendAsync("extractionFinished", body);
  9.     }
  10. }

Обработка extractionFinished на клиентской стороне:

Код - JavaScript: [Выделить]
  1. connection.on("extractionFinished", function (data) {
  2.                 launchViewer(data.resourceUrn);
  3. });

Коммит на 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