从客户端连接到 SignalR 服务器

Connecting to SignalR Server from Client

我今天有一个 Web 服务器充当 SignalR 服务器,来自 JS 的连接进入正确的集线器并得到正确处理。

注册并启动JS端的例子

hub = $.connection.webRTCHub;
$.connection.hub.qs = "type=pusher";

$.connection.hub.start().done(function () {
     connectionId = $.connection.hub.id;
     log("Connected with id ", $.connection.hub.id);
});

当尝试使用 C# SignalR 客户端 Nuget 包连接到此 SignalR 服务器时,我连接了,我得到了一个连接 ID,但我认为我没有连接到正确的集线器,因为没有触发日志记录,也不会向其余客户端发送正确的响应。

我正在使用 SignalR 的跟踪日志,它显示连接,并显示 ID 正在连接。下面是来自 C# 客户端的连接代码

connection = new HubConnection("http://localhost/signalr/hubs/webRTCHub");
await connection.Start();
MessageBox.Show(connection.ConnectionId);

我也试过了

connection = new HubConnection("http://localhost/signalr/webRTCHub");

connection = new HubConnection("http://localhost/");

有人可以指出我从哪里开始的正确方向吗?

我猜你还没有创建任何自定义路由来处理信号器请求。您应该在没有任何 url 的情况下初始化 HubConnection 对象,这会将连接对象的 url 初始化为“/signalr”作为默认值。

connection = new HubConnection("");

或者只是

connection = new HubConnection();

确保您在应用启动时注册了您的集线器路由,例如,如果您使用的是 .NET 核心:

 app.UseSignalR(routes =>
 {
     routes.MapHub<webRTCHubHub>("/signalr/hubs/webRTCHub");
 });

虽然 class webRTCHub 应该看起来像这样:

public class webRTCHub : Hub
{
    public async Task SendNotification(string userId, string message)
    {
        await Clients.User(userId).SendAsync("ReceiveNotification", "You have a new message: " + message);
    }
    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
    }
    public override async Task OnDisconnectedAsync(Exception exception)
    {
        await base.OnDisconnectedAsync(exception);
    }
}

对于js端:

"use strict";

var connection;

connection = new signalR.HubConnectionBuilder()
    .withUrl('http://localhost/signalr/hubs/webRTCHub')
    .build();

connection.on('ReceiveNotification', (message) => {
   // show the message maybe
})

connection.start().catch(function (err) {
   return console.error(err.toString())
});

connection.on('finished',(update)=>{
   connection.stop();
});

要将消息从客户端发送回服务器,您还应该在 class 中创建一个方法并从脚本中调用该方法

更新:包和服务

对于ASP.NET:

NuGet 包:

Microsoft.AspNet.SignalR

映射路线 Application_Start

RouteTable.Routes.MapHubs("/signalr/hubs/webRTCHub", new webRTCHub());

对于 .NET Core:

确保安装以下包并在 ConfigureServices

中添加 SignalR

Microsoft.AspNetCore.SignalR

public void ConfigureServices(IServiceCollection services)
{
   // ...
   services.AddSignalR();
   // ...
}

由于您使用的是 .NET FW 而不是 .NET Core,因此您应该像这样在服务器上配置集线器:

启动时:

public void Configuration(IAppBuilder app)
{
    //Branch the pipeline here for requests that start with "/signalr"
    app.Map("/signalr", map =>
   {
       map.UseCors(CorsOptions.AllowAll);
       var hubConfiguration = new HubConfiguration { };
       map.RunSignalR(hubConfiguration);
   });
}

您使用的包:

Microsoft.AspNet.SignalR;

Microsoft.Owin;

然后在客户端对于固件和核心是一样的,只需指向您的集线器。

我在这里看不到,但是您需要为要连接的 Hub 创建一个 HubProxy。

我假设你的中心是 "webRTCHub"。

using(var connection = new HubConnection("http://localhost/"))
{
  var hubProxy = _connection.CreateHubProxy("webRTCHub");
  hubProxy.On("yourevent", () =>
  {
    _logger.Debug("Event recieved");
  });

  await _connection.Start();
}