【问题标题】:Connecting to SignalR Server from Client从客户端连接到 SignalR 服务器
【发布时间】:2020-05-15 10:06:43
【问题描述】:

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

注册并启动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 Client 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/");

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

【问题讨论】:

  • 从 JS 端你需要做 2 件事:1. 注册集线器 2. 启动集线器(连接) - 如果你有的话,你能显示你这样做的代码吗?跨度>
  • 我也添加了起始代码块
  • 只是为了确定;您没有混合 SignalR 核心和经典 SignalR 对吗?而且我假设您在任何地方都没有错误记录?
  • 检查我在服务器端的依赖项,它确实看起来像是在使用 SignalR 核心。我正在浏览 nuget 包,但找不到任何与 MVC 项目匹配的经典 SignalR?

标签: c# asp.net-mvc signalr signalr-hub signalr.client


【解决方案1】:

我在这里看不到,但您需要为要连接的 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();
}

【讨论】:

    【解决方案2】:

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

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

    虽然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();
    });
    
    

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

    更新:包和服务

    对于 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 Core 的吗?我找不到 UseSignalR 也找不到 MapHub
    • 是的,你应该来自 Nuget 的 installuse Microsoft.AspNetCore.SignalR
    • 服务器端是.NET MVC项目,不使用.NET Core
    • 我认为在 .Net 框架中您应该将其添加到 Application_StartRouteTable.Routes.MapHubs("/signalr/hubs/webRTCHub", new webRTCHub());
    【解决方案3】:

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

    connection = new HubConnection("");
    

    或者只是

    connection = new HubConnection();
    

    【讨论】:

    • 我会试试这个,但是客户端怎么知道要访问哪个 url?现在它是本地主机,因为我正在测试,但是当发布到生产环境时它不会是本地的
    • 三个 url 将是相对的而不是绝对的,所以它应该在生产中工作。我将类似的代码部署到生产环境中,运行良好。
    • 它甚至没有连接,我看不出它是怎么连接的,因为我没有设置一个 url
    【解决方案4】:

    由于您使用的是 .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;

    微软.Owin;

    那么在客户端对于 FW 和 Core 是相同的,只需指向您的集线器即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多