#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. Поэтому вам следует выполнить следующие действия
- Создайте ярлык chrome на рабочем столе и переименуйте no-cors (любое имя)
- Щелкните правой кнопкой мыши по значку и перейдите к свойству
- Следующая цель изменения на «C:Program Файлы (x86) GoogleChromeApplicationchrome.exe » —disable-web-security —user-data-dir=»D:/Chrome » и сохраните.
Тогда запустите этот загрузчик, он обязательно сработает. Спасибо