Итак, у меня есть приложение Angular 6, которое взаимодействует с серверной частью .Net Core 2.1 и использует пакет @ aspnet / signalr npm (версия ^ 1.0.3).Я построил сервис Angular для размещения кода SignalR.
То, что я пытаюсь сделать, потому что я не тестирую SignalR (пока) в моих тестах Angular / Jasmine, - это написать код, который по сути говорит: «если этот сервис работает в контексте Angular /Тестирование Жасмин, затем не пытайтесь запустить код, который подключается к концентратору SignalR. "
Мой код для взаимодействия с SignalR со стороны клиента выглядит так (в конструкторе моего сервиса):
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl(this.rootUrl)
.build();
this.hubConnection
.start()
.then(() => console.log('Connection started!'))
.catch(err => console.log('Error while establishing connection :('));
this.hubConnection.on('sendToAll', (sr_senderName: string, receivedMessage: string) => {
const text = `${receivedMessage}`;
this.add(sr_senderName, text, false);
});
В контексте запуска моего приложения все работает нормально, а SignalR работает отлично.
Однако, когда я пытаюсь запустить "тест ng", т.е. в контексте запуска моегоТесты Жасмин, я получаю ошибки, подобные этой в консоли:
Не удалось загрузить http://localhost:9017/eventHub/negotiate: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: Нет заголовка «Access-Control-Allow-Origin»присутствует на запрашиваемом ресурсе.Следовательно, Origin 'http://localhost:9876' не имеет доступа.
Итак, я понимаю, что это, очевидно, проблема CORS, поэтому я попытался изменить ее на стороне .Net Core, чтобы разрешить происхождение CORS:
builder.WithOrigins("http://localhost:4200", "http://localhost:9876")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
И это устраняет ошибки в консоли браузера.На данный момент это нормально, и я сделаю это как временную меру, но она все еще не совсем идеальна.
Я думал о каком-то хаке в коде Angular, например, попробуйте обнаружить контекст, и если он находится вконтекст запуска тестов, вместо запуска реального приложения, затем не пытайтесь подключиться;но я не смог заставить это работать (например, пытаться смоделировать Маршрутизатор или Местоположение в моих тестах Angular), но в любом случае это кажется немного уродливым.
Мне просто интересно, есть ли более элегантное решение для этого.