Как перевести http веб-запрос на исходный API на основе веб-сокетов

Я должен реализовать архитектуру для решения проблемы, представленной на следующем рисунке:

Облако в локальный API

По сути, мне нужно развернуть общедоступный API в облаке (Azure), но данные находятся на локальных машинах. Локальные машины предоставляют Swagger API, который предоставляет данные. Каждый локальный компьютер имеет уникальный идентификатор (идентификатор установки), который позволяет нам направлять запросы.

Я разработал решение на основе модуля ретрансляции служебной шины Azure, следуя подходу, предложенному по следующей ссылке:

Безопасный доступ в Интернет к локальному API

Решение, основанное на модуле ретрансляции Azure Service Bus, решает мою проблему и соответствует большинству моих потребностей, но у него есть одна проблема, задержка ужасна.

Я развернул общедоступный API и конечную точку служебной шины в одном и том же географическом регионе, и простой запрос GET /companies в среднем занимает 1,5 секунды, время обработки в локальном API очень мало, всего пару миллисекунд.

Чтобы поддерживать минимальную задержку, я думал об использовании веб-сокетов, но я не знаю, является ли это лучшим подходом с учетом сценария, потому что для каждого запроса к общедоступному API я должен был бы открыть канал веб-сокетов. к локальному API внутри ApiController и позаботьтесь о его жизненном цикле (закройте его, прежде чем возвращать ответ).

Очевидно, что в этом сценарии каждый ApiController в локальном API должен обеспечивать поддержку веб-сокетов и http одновременно.

Другое решение - реализовать http-прокси, который ретранслирует исходный запрос от общедоступного API на локальный API, но, с моей точки зрения, наилучшая возможная задержка достигается при использовании коммуникационного P2P без менеджеров по связям в середине. по этой причине мой фокус сейчас на веб-сокеты.

Я хочу максимально соответствовать стандартам, поэтому я хочу использовать "чистые" веб-сокеты, то есть не использовать Signalr.

После того, как я раскрыл свою проблему, решение и альтернативы, мои вопросы таковы:

  1. Как я могу открыть веб-сокет внутри метода действия класса ApiController и передать исходный http-запрос из открытого API в локальный API?

  2. Как я могу обеспечить поддержку в локальном API для протоколов HTTP и WebSockets. Локальный API должен уметь обрабатывать HTTP-запросы, а также запросы WebSocket.

  3. Моя первая ставка - использование System.Net.WebSockets, но я хотел бы знать, существует ли какая-либо библиотека веб-сокетов, которая светится при интеграции с ASP.NET Web API.

1 ответ

простой запрос GET / компании занимает в среднем 1,5 секунды, время обработки в локальном API очень мало, всего пару миллисекунд

Вы используете службу ретрансляции Azure для безопасного предоставления служб общедоступному облаку. Насколько мне известно, мы не достигли бы такой же задержки, что и локальный сервер, из-за множества факторов, влияющих (например, клиент должен сначала пройти аутентификацию на сервере). Реле сервисной шины).

Кроме того, в этой статье на примере объясняется, как создать собственный обработчик HTTP для приема клиентских запросов WebSocket, вы можете обратиться к нему, чтобы изменить приложение API для обработки запросов WebSocket.