Подробный обзор того, как механизм обратного вызова в серверной части библиотеки можно распространить на интерфейс веб-клиента через группы 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 должно использоваться в двух местах:
- В вызове REST API, сделанном веб-клиентом
- В клиентском 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)
:
- Принимает обязательный параметр - subid
- Возвращает фактический объект
SimpleDLLFeedback
для вызоваSimpleMethod
на
Создайте SimpleDLLFeedbackProxy для подключения вызывающего клиента к отзыву.
SimpleDLLFeedbackProxy
выглядит следующим образом:
Прокси принимает следующие входные параметры во время создания экземпляра:
INotifyingFeedbackWriter
для установки фактического уведомителя, который будет использоваться для обратной связи.IHubContext
для получения текущего клиентского подключения с использованием subid для запроса группы подключения.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.
Надеюсь, что моя статья поможет другим.