我正在尝试构建一个SignalR概念证据,其中涉及两个应用程序;一个是Web单页面应用程序,另一个是服务器端RESTful Web API。正在使用的技术/框架是ReactJs,ASP.NET Web API 2(.NET Framework 4.6,非.NET Framework Core)和SignalR。
这就是我在服务器应用程序中连接SignalR的方法。当应用程序启动时,我将SignalR映射到应用程序管道......
public static void ConfigureSignarlR(IAppBuilder app)
{
app.MapSignalR<ChatConnection>("/signalr", new Microsoft.AspNet.SignalR.HubConfiguration
{
EnableDetailedErrors = true
});
}
ChatConnection
类是PersistentConnection
的一个实现,没有什么特别之处......
public class ChatConnection : PersistentConnection
{
protected override Task OnReceived(IRequest request, string connectionId, string data)
{
return base.OnReceived(request, connectionId, data);
}
protected override Task OnConnected(IRequest request, string connectionId)
{
return base.OnConnected(request, connectionId);
}
public override Task ProcessRequest(HostContext context)
{
return base.ProcessRequest(context);
}
}
然后我有一个非常简单的中心...
public class ChatHub : Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
对于客户端应用程序,我正在使用@aspnet/signalr-client
npm包...这就是我创建和启动连接的方式......
initialize = () => {
const hubCon = new HubConnection("http://api.domain/signalr");
hubCon.start()
.then(() => console.log("Connection established..."))
.catch(err => console.log(err))
}
API和客户端应用程序都托管在同一本地IIS服务器上,但具有不同的主机名(使用主机文件)
使用浏览器导航至http://api.domain/signalr/hubs
时,在收到消息Protocol error: Unknown transport.
尝试从客户端应用程序连接时,我收到相同的错误消息
调试ProcessRequest
类时,ChatConnection
方法是唯一被点击的方法
我在这里想念的是什么?或者我怎样才能使这个PoC工作?
这个问题非常广泛,因为我真的不知道这里发生了什么
答案 0 :(得分:0)
经过一些挖掘和阅读SignalR文档后,我意识到我做错了什么。基本上,SignalR实现了两种不同的连接模式:
客户端无法使用集线器代理与持久连接端点通信(或者至少不是我这样做的方式)。所以,我做的是:
保留PersistentConnection但覆盖OnReceived方法,以便它可以向所有客户端进行广播
protected override async Task OnReceived(IRequest request, string connectionId, string data)
{
await Connection.BroadCast("message to broadcast");
}
删除了&#34; signalr \ hubs&#34;脚本参考,因为它不需要
在启动时注册连接(服务器端)
app.MapSignalR<ChatConnection>("/chat");
Finnaly,在客户端,初始化连接并注册所有必要的回调
this.connection = window.$.connection(process.env.REACT_APP_API_BASE_URI + "/chat");
this.connection.logging = true;
this.connection.received((data) => {
console.log("Received some data:")
console.log(data)
});
this.connection.start(() => {
console.log("Connection opened")
console.log("connectionId = " + this.connection.id)
});