У меня есть устаревший проект веб-формы, в который необходимо интегрировать технологию обработки сигналов. Я понял, что сигнализаторы / концентраторы генерируются динамически, однако в моем конкретном проекте c я не смог заставить его работать.
Я пытался загрузить все URL-пути, такие как:
<script src="../signalr/hubs"></script>
<script src="~/signalr/hubs"></script>
<%--<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>--%>
Чтобы обернуть это я генерирую signalR в другом проекте, который работает нормально, и я скопировал в мою папку скриптов /Scripts/SignalR/Hub.js, и я ссылался на него на стороне клиента.
<script src="../Scripts/SignalR/Hubs.js"></script>
Это работало нормально, потому что мой клиент мог установить sh соединение с моим chatHub (серверным), инициализируя мою переменную чата, как показано ниже:
Однако после этого я получил ошибку в процессе передачи данных между сервером и клиентом, как показано ниже:
Я думаю, это потому, что когда сервер пытается установить связь с клиентом, он генерирует URL-адрес как [signalr / hub], но, как я упоминал ранее, я использую файл /Scripts/SignalR/Hub.js для экземпляра подключения к концентратору.
Как я могу исправить эту проблему между сервером и клиентом?
Вот мои файлы структуры
startup.cs
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;
using SistemaJaspion.AppCode;
using System.Web.Routing;
[assembly: OwinStartup(typeof(SistemaJaspion.AppCode.Startup))]
namespace SistemaJaspion.AppCode
{
/// <summary>
/// The server needs to know which URL to intercept and direct to SignalR. To do that we add an OWIN startup class.
/// </summary>
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
//app.MapSignalR("/signalr", new HubConfiguration());
//app.MapSignalR();
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
hubConfiguration.EnableJavaScriptProxies = true;
app.MapSignalR("/signalr", hubConfiguration);
}
}
}
ChatHub.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Web;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
namespace SistemaJaspion.AppCode
{
/// <summary>
/// The Hub class is used to define methods the clients can call on the server
/// </summary>
///
[HubName("chatHub")]
//[Microsoft.AspNet.SignalR.Authorize]
public class ChatHub : Hub
{
static List<UsuariosSignalR> ConnectedUsers = new List<UsuariosSignalR>();
// Number of connected clients
private static int connectionCount = 0;
public void Send(string name, string message)
{
// Append the current date
name = DateTime.Now.ToString() + " " + name;
// Call the broadcastMessage method to update clients.
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
// Increase the number of connections
Interlocked.Increment(ref connectionCount);
// Update the number of the connected users
Clients.All.reportConnections(connectionCount);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
// Decrease the number of connections
Interlocked.Decrement(ref connectionCount);
// Update the number of the connected users
Clients.All.reportConnections(connectionCount);
return base.OnDisconnected(stopCalled);
}
}
}
MasterPage.aspx
<script src="../Scripts/jquery-1.6.4.min.js"></script>
<script src="../Scripts/jquery.signalR-2.4.1.js"></script>
<script src="../Scripts/SignalR/Hubs.js"></script>
<!--Add script to update the page and send messages.-->
<script type="text/javascript">
$(function () {
/* Peer-to-peer broadcast code */
// Declare a proxy to reference the ChatHub.
debugger;
var chat = $.connection.chatHub;
chat.client.reportConnections = function (count) {
$("#usersCount").text(count);
}
$.connection.hub.logging = true;
$.connection.hub.start();
});
</script>