Ошибка: не удалось завершить согласование с сервером: ошибка: не найдено
Я использую SignalR с ASP.NET Boilerplate .NET Core 3.1, но я столкнулся с этой проблемой
Ошибка: не удалось завершить согласование с сервером: ошибка: не найдено
Как я могу решить эту проблему, не пропуская переговоры (решение, упомянутое здесь)
zone-evergreen.js:2845 POST http://localhost:21021/signalr/negotiate?enc_auth_token=wNYmO41%2F Показать еще 162 кадра signalr.min.js:16 [2020-06-07T10:17:31.634Z] Ошибка: Не удалось установить соединение: ошибка: не найдено
вот угловой код:
ngOnInit(): void {
this.renderer.addClass(document.body, 'sidebar-mini');
//SignalRAspNetCoreHelper.initSignalR();
// SignalRAspNetCoreHelper.initSignalR(); // Replace this line with the block below
SignalRAspNetCoreHelper.initSignalR(() => {
var chatHub = null;
abp.signalr.startConnection(abp.appPath + 'signalr-myChatHub', function (connection) {
chatHub = connection; // Save a reference to the hub
connection.on('getMessage', function (message) { // Register for incoming messages
console.log('received message: ' + message);
});
}).then(function (connection) {
abp.log.debug('Connected to myChatHub server!');
abp.event.trigger('myChatHub.connected');
});
abp.event.on('myChatHub.connected', function() { // Register for connect event
chatHub.invoke('sendMessage', "Hi everybody, I'm connected to the chat!"); // Send a message to the server
});
});
}
и вот код.NET Core Class:
using Abp.Dependency;
using Abp.Runtime.Session;
using Castle.Core.Logging;
using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace HealthMapControlPanel.ChatAppService
{
public class MyChatHub : Hub, ITransientDependency
{
public IAbpSession AbpSession { get; set; }
public ILogger Logger { get; set; }
public MyChatHub()
{
AbpSession = NullAbpSession.Instance;
Logger = NullLogger.Instance;
}
public async Task SendMessage(string message)
{
await Clients.All.SendAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
}
public override async Task OnConnectedAsync()
{
await base.OnConnectedAsync();
Logger.Debug("A client connected to MyChatHub: " + Context.ConnectionId);
}
public override async Task OnDisconnectedAsync(Exception exception)
{
await base.OnDisconnectedAsync(exception);
Logger.Debug("A client disconnected from MyChatHub: " + Context.ConnectionId);
}
}
}
Код Startup.cs, связанный с классом:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
app.UseSignalR(routes =>
{
routes.MapHub<MyChatHub>("/signalr-myChatHub");
});
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<MyChatHub>("/signalr-myChatHub");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");
});
}
и вот скриншот консоли веб-браузера:
3 ответа
Эта ошибка связана с подключением к /signalr
за AbpCommonHub
, используемый ABP для уведомлений в реальном времени.
Документ ABP: https://aspnetboilerplate.com/Pages/Documents/Notification-System
Вы должны восстановить endpoints.MapHub<AbpCommonHub>("/signalr");
.
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<AbpCommonHub>("/signalr"); // Restore this
endpoints.MapHub<MyChatHub>("/signalr-myChatHub");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");
});
Кстати, вы можете удалить app.UseSignalR(...);
, который устарел в пользу app.UseEndpoints(...);
.
Убедитесь, что вы не ошиблись в строке конечной точки концентратора на стороне клиента. Например, если ваш сервер сопоставляет ваш концентратор с/notificationsHub
:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<NotificationsHub>("/notificationsHub");
});
Тогда ваша строка конечной точки внешнего интерфейса должна быть написана точно так же:
this.notificationHubConnection = new signalR.HubConnectionBuilder()
.withUrl(environment.apiHost + '/notificationsHub')
.withAutomaticReconnect()
.build();
В документации указано, что использование UseEndPoints больше не является необходимым/устарело. Вы можете сопоставить конечную точку непосредственно с веб-API. вместо:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<AbpCommonHub>("/signalr"); // Restore this
endpoints.MapHub<MyChatHub>("/signalr-myChatHub");
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");
});
Ты можешь сделать:
app.MapHub<AbpCommonHub>("/signalr");
app.MapHub<MyChatHub>("/signalr-myChatHub");