Подробный обзор того, как механизм обратного вызова в серверной части библиотеки можно распространить на интерфейс веб-клиента через группы SignalR.

Недавно мне пришлось выяснить, как создать библиотеку, которая обеспечивает обратную связь с пользователем независимо от того, является ли пользователь простым консольным приложением .NET или веб-клиентом ASP.Net. Пример кода, который я собираюсь использовать в этой статье, значительно упрощен, начиная с библиотеки:

SimpleDLLFeedback обеспечивает основные функции и может использоваться как из консольного приложения .NET, так и из веб-API ASP.Net Core. Клиент, использующий API, должен показывать любые отзывы от SimpleDLLFeedback в выделенной области пользовательского интерфейса.

В этой статье описывается, как передать "SimpleMethod called"обратную связь от SimpleDLLFeedback веб-клиенту через уровень веб-API с помощью SignalR без изменения кода в библиотеке DLL. В статье основное внимание уделяется только уровню веб-API и моделируется внешний интерфейс с использованием:

  • инструмент Postman — для отправки запроса на уровень веб-API.
  • Приложение .Net Console (HttpClient) — для получения отзывов "SimpleMethod called" от SimpleDLLFeedback

Основной уровень веб-API ASP.Net

Я создал стандартный веб-API ASP.Net Core с помощью команды dotnet new webapi и удалил код контроллера по умолчанию. Затем я запустил dotnet add package Microsoft.AspNetCore.SignalR, чтобы добавить пакет SignalR nuget, и добавил функциональность SignalR в файл Startup.cs:

Создайте концентратор SignalR и сохраните информацию о клиентском подключении.

Концентратор SignalR с именем FeedbackNotifierHub создает группу подключения клиента, используя subscriberID, как показано ниже:

Context.GetHttpContext().Request.Query[subscriberIdTag] ищет параметр запроса subid в клиентском запросе на подключение и использует это значение для добавления подключения в группу, идентифицируемую идентификатором подписчика Groups.AddToGroupAsync(Context.ConnectionId, subscriberID). Использование идентификатора подписчика таким образом позволило мне подключить запрос клиента для запуска SimpleMethod через REST API к http-соединению «того же» клиента для получения обратной связи "SimpleMethod called" через SignalR. Важно понимать, что значение subid должно использоваться в двух местах:

  1. В вызове REST API, сделанном веб-клиентом
  2. В клиентском HTTP-подключении к концентратору SignalR для получения отзыва.

Я добавил FeedbackNotifierHub в файл Startup.cs следующим образом:

Точный URL-адрес подключения для клиента с идентификатором подписчика Client1 будет следующим (мой локальный сервер работает на порту 5000):

http://localhost:5000/feedbacknotifierhub?subid=Client1

Используйте SimpleDLLFeedback от контроллера ASP.Net.

Чтобы добавить SimpleDLLFeedback в контроллер ASP.Net, я сначала создал службу NotifyingFeedbackWriter:

INotificationFeedbackWriter выглядит следующим образом:

Здесь важно отметить, что я не мог использовать интерфейс IWriter напрямую, так как мне нужен был способ подключить клиентский вызов REST API к HTTP-подключению того же клиента к концентратору SignalR. Для этого используется метод SetNotifier.

Также обратите внимание, как IFeedbackNotifier появляется в этом интерфейсе, а также как строго типизированный Hub, используемый в FeedbackNotifierHub : Hub<IFeedbackNotifier>. Это указывает на то, что клиентский интерфейс концентратора SignalR используется для отправки фактического уведомления об отзыве клиенту.

После создания реализации IWriter я добавил в контроллер службу SimpleDLLFeedback:

Важно добавить службу INotifyingFeedbackWriter в качестве службы с ограниченной областью действия. Я вернусь к этому позже в статье.

ISimpleDLLFeedback используется контроллером следующим образом:

Что ж, получается, что Контроллер использует SimpleDLLFeedback не напрямую, а через прокси с именем SimpleDLLFeedbackProxy. Прокси — это просто оболочка для соединения вызова REST API с simplemethod с подключением HTTP-клиента к концентратору SignalR через subid, который является обязательным параметром запроса для вызова REST API. .

Я также использовал объект Func, чтобы сделать вызов SimpleDLLFeedback «чище». Обратите внимание, как SimpleDLLFeedback(subid) :

  1. Принимает обязательный параметр - subid
  2. Возвращает фактический объект SimpleDLLFeedback для вызова SimpleMethod на

Создайте SimpleDLLFeedbackProxy для подключения вызывающего клиента к отзыву.

SimpleDLLFeedbackProxy выглядит следующим образом:

Прокси принимает следующие входные параметры во время создания экземпляра:

  1. INotifyingFeedbackWriter для установки фактического уведомителя, который будет использоваться для обратной связи.
  2. IHubContext для получения текущего клиентского подключения с использованием subid для запроса группы подключения.
  3. ISimpleDLLFeedback для возврата фактического объекта, используемого для вызова

Единственная причина, по которой я использовал прокси, заключается в том, чтобы скрыть тот факт, что каждый вызов SimpleDLLFeedback требует, чтобы сначала был установлен subid через вызов REST API.

Используемый здесь входной параметр конструктора INotifyingFeedbackWriter создаст новый экземпляр в модели внедрения зависимостей ASP.Net, если только служба не будет добавлена ​​как служба с ограниченной областью действия, что я уже делал ранее. Очень важно, чтобы один и тот же экземпляр использовался для обработки REST API и при создании службы SimpleDLLFeedback.

Я добавил SimpleDLLFeedbackProxy в контроллер:

Симулированный интерфейс

Отправить запрос

Теперь, когда я создал ASP.Net WEB API, я могу просто запустить его, используя dotnet run :

После запуска WebServer я отправил запрос REST API GET http://localhost:5000/simplemethod?subid=Client1 с помощью Postman, который вернул 200 OK.

Вывод веб-сервера:

Получить отзыв

Чтобы получить обратную связь SimpleMethod called от библиотеки, я создал консольное приложение .NET, которое подключается к концентратору SignalR и прослушивает ReceiveFeedback вызовы на клиентском соединении:

Я также добавил следующие пакеты nuget в HttpClient:

1. dotnet add package Microsoft.AspNetCore.SignalR.Client
2. dotnet add package Microsoft.Extensions.Logging

После запуска сервера и HttpClient с параметром Client1 вижу в консоли сервера следующее:

После отправки запроса REST API Get я вижу в консоли HttpClient следующее:

Весь код, использованный в этой статье, можно найти в моем репозитории GitHub.

Надеюсь, что моя статья поможет другим.