从客户端连接到 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();
}
我今天有一个 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
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();
}