SignalR .NET Core 2.1 не работает на прокси-контейнере с прокси - PullRequest
0 голосов
/ 11 мая 2018

У меня есть .NET Core 2.1 Web API (использующий 2.1.0-preview1-final), работающий нормально локально, используя SignalR 1.0.0-preview1-final. Я использую для внешнего интерфейса приложение Angular, которое имеет пакет "@aspnet/signalr": "1.0.0-preview1-final", поэтому все совпадает, и у меня и конечные точки HTTP, и концентраторы работают как положено, когда я запускаю программы локально.

При развертывании на моем виртуальном сервере у меня есть обратный прокси-сервер Nginx, который отправляет запрос всем приложениям за ним. Я использую Docker, и у меня не было проблем с ним в других проектах, когда мы развернули v1.0 всей экосистемы.

Различия, которые я имею в этом конкретном сценарии, две:

  1. У меня есть IdentityServer4, использующий AspNetIdentity, и мне пришлось удалить опцию proxy_buffering off из конфигурации Nginx, чтобы заставить его работать (после https://andrewlock.net/fixing-nginx-upstream-sent-too-big-header-error-when-running-an-ingress-controller-in-kubernetes/)
  2. Я читал, что вы не должны делать 1) при использовании SignalR, потому что у вас могут быть проблемы с ним - не уверен, так ли это сейчас.

Я записываю логи API и вижу, что когда я пытаюсь подключиться к концентраторам, я возвращаюсь:

info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
      Policy execution successful.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[2]
      Successfully validated the token.
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
      Authorization was successful.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 7.4652ms 200 application/json

Так что я предполагаю, что это правильно. Теперь на стороне клиента (приложение Angular): я вижу это:

Ошибка: не удалось установить соединение. Ошибка: доступные транспорты не найдены.

но если я проверю ответ:

{"connectionId":"nHzKKYtp0ITwlEntjqLprA","availableTransports":[{"transport":"WebSockets","transferFormats":["Text","Binary"]},{"transport":"ServerSentEvents","transferFormats":["Text"]},{"transport":"LongPolling","transferFormats":["Text","Binary"]}]}

UPDATE

По сравнению с ответом при локальном запуске я получил:

{"connectionId":"4ea7b1ea-8754-472b-baef-527073872d2a","availableTransports":["WebSockets","ServerSentEvents","LongPolling"]}

Это означает, что нет никаких ограничений в отношении форматов передачи? Не уверен, что это тоже актуально ... Это очень странно, здесь происходит то же самое: SignalR без транспорта

------ ОБНОВЛЕНИЕ КОНЦА --------

Итак, мои вопросы:

Не нарушил ли я связь с SignalR, потому что установил proxy_buffer? Если так, есть ли способ заставить и IS4, и SignalR работать за одним и тем же экземпляром Nginx? - Для усложнения я использую шаблон Nginx, который генерируется автоматически с помощью docker-gen.

Если мои изменения в Nginx не должны нарушать SignalR, почему не устанавливается соединение?

Спасибо!

UPDATE! НАЙТИ НОМЕР !!!

Я пишу это, потому что думаю, что это может быть полезно для кого-то еще.

Проблема, с которой я столкнулся, заключалась в том, что я использовал preview1 как на клиенте, так и на API, но в тот день, когда я создал Dockerfile, я не смог заставить FROM microsoft/dotnet:2.1.0-preview1-aspnetcore-runtime работать, поэтому я решил использовать preview2: FROM microsoft/dotnet:2.1.0-preview2-aspnetcore-runtime и это была проблема. Теперь я быстро изменил клиент и API, чтобы использовать предварительный просмотр SignalR, и я смог заставить соединение работать. Счастливые дни! Надеюсь, это будет полезно :) Так что не только клиент и API должны соответствовать, но и фактическое изображение докера также должно быть выровнено.

1 Ответ

0 голосов
/ 13 мая 2018

Проблема, с которой я столкнулся, заключалась в том, что я использовал preview1 как на клиенте, так и на API, но в тот день, когда я создал Dockerfile, я не смог использовать FROM microsoft/dotnet:2.1.0-preview1-aspnetcore-runtime, потому что у меня были проблемы с метаданными (взяты из ошибки). поэтому я решил использовать preview2: FROM microsoft/dotnet:2.1.0-preview2-aspnetcore-runtime, и это было проблемой. Теперь я быстро изменил клиент и API, чтобы использовать предварительный просмотр SignalR, и я смог заставить соединение работать. Счастливые дни! Надеюсь, это будет полезно :) Так что не только клиент и API нуждаются в сопоставлении, но и фактическое изображение докера также должно быть выровнено.

Поэтому при создании образа убедитесь, что у вас синхронизирована версия клиента, версия net Core signalr и версия вашего Dockerfile во время выполнения.

...