Не удается подключиться к signalr hub из приложения ionic: доступ к XMLHttpRequest… заблокирован политикой CORS

#asp.net #ionic-framework #cors #signalr #ionic4

#asp.net #ionic-framework #cors #signalr #ionic4

Вопрос:

Я пытаюсь разработать простое подтверждение концепции для приложения ionic, отправляющего и получающего сообщения signalr. У меня есть очень простое веб-приложение signalr, встроенное в .net 4.5, которое успешно отправляет и получает сообщения от подключенных клиентов внутри хоста приложения.

Сейчас я пытаюсь подключиться к этому из приложения ionic, но получаю сообщение

Доступ к XMLHttpRequest по адресу ‘http://localhost:59621/signalr/negotiate «из источника»http://localhost:8100 ‘ заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: значение заголовка ‘Access-Control-Allow-Origin’ в ответе не должно быть шаблоном ‘*’, когда режим учетных данных запроса ‘include’.

при попытке установить соединение с signalr hub.

Мы высоко ценим любую помощь.


.Net Code

Startup.cs

 public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
        app.Map("/signalr", map =>
        {
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration
            {
                EnableDetailedErrors = true,
            };
            map.RunSignalR(hubConfiguration);
        });
    }
}
  

ChatHub.cs

 [HubName("ChatHub")]
public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        // Call the addNewMessageToPage method to update clients.
        Clients.All.addNewMessageToPage(name, message);
    }
}
  

Ионный код

 import { Component } from '@angular/core';
import { NavController, DateTime, AlertController } from 'ionic-angular';
import { HubConnection, HubConnectionBuilder } from '@aspnet/signalr';

@Component({
    selector: 'page-home',
    templateUrl: 'home.html'
})
export class HomePage {

    hubConnection: HubConnection;
    name: string;
    message: string;
    messages: string[] = [];

    constructor(public navCtrl: NavController, public alertCtrl: AlertController) {

    }

    ionViewDidLoad() {

    }

    ionViewWillEnter() {
        let alert = this.alertCtrl.create({
            title: 'Demo',
            message: 'What is your name?',
            inputs: [
                {
                    name: 'Name',
                    placeholder: 'Name'
                }
            ],
            buttons: [
                {
                    text: 'Enter',
                    handler: data => {
                        this.name = data.Name;
                    }
                }
            ]
        });

        alert.present();

        this.hubConnection = new HubConnectionBuilder().withUrl('http://localhost:59621/signalr').build();
        this.hubConnection
            .start()
            .then(() => console.log('Connection started!'))
            .catch(err => {
                debugger;
                console.log('Error while establishing connection :(')
            });

        this.hubConnection.on('addNewMessageToPage', (name: string, receivedMessage: string) => {
            const text = `${name}: ${receivedMessage}`;
            this.messages.push(text);
        });
    }

    sendMessage() {
        this.hubConnection
            .invoke('send', this.name, this.message)
            .then(() => this.message = '')
            .catch(err => console.error(err));
    }
}
  

Информация об Ionic

Ionic:

ionic (Ionic CLI): 4.0.6

Ionic Framework: ionic-angular 3.9.3

@ionic/ app-scripts: 3.2.1

Кордова:

cordova (Cordova CLI): 8.1.0 Платформы Cordova: отсутствуют

Система:

NodeJS: версия 8.11.0 (C:Program Filesnodejsnode.exe ) npm: 5.6.0 ОС: Windows 10

Окружающая среда:

ANDROID_HOME: не установлен

Ответ №1:

Проблема заключалась в том, что плагин signalr для ionic требовал серверной части .Net Core. Я пытался использовать серверную часть .Net Framework.

Комментарии:

1. Не могли бы вы, пожалуйста, подробнее объяснить свое решение? Я также пытаюсь подключиться к SignalR из ionic и застрял с той же проблемой..

2. На чем построено ваше серверное приложение / api? Он построен на .Net Core или стандартной .Net Framework

Ответ №2:

Ваш код в порядке. проблема, связанная с CORS. Поэтому вам следует выполнить следующие действия

  1. Создайте ярлык chrome на рабочем столе и переименуйте no-cors (любое имя)
  2. Щелкните правой кнопкой мыши по значку и перейдите к свойству
  3. Следующая цель изменения на «C:Program Файлы (x86) GoogleChromeApplicationchrome.exe » —disable-web-security —user-data-dir=»D:/Chrome » и сохраните.

Тогда запустите этот загрузчик, он обязательно сработает. Спасибо