我觉得我要么错过了SignalR服务的要点,要么是我弄错了它的架构。
使用Azure SignalR服务,前端到前端的通信就这样工作;
Startup.cs
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
app.MapAzureSignalR(this.GetType().FullName);
}
Hub.cs
private void BroadcastMessage(string message)
{
Clients.All.broadcastMessage(message);
}
Index.html
hubName.client.broadcastMessage = function (message) {
alert(message);
};
$('#btn').click(function () {
hubName.server.broadcastMessage("Hello World");
});
这很好,当我需要后端触发消息时,我正在使用以下内容;
Functions.cs
HubConnection signalr = new HubConnection("http://localhost:57690/");
IHubProxy hub = null;
if (signalr.State == ConnectionState.Disconnected)
{
hub = signalr.CreateHubProxy(hubName);
signalr.Start().Wait();
}
hub.Invoke(functionName, args);
signalr.Stop();
尽管这样做有效,但让我想知道我是否实施有误,因为http://localhost:57690/signalr/hubs
可以公开来自任何来源的帖子。
在前端,我必须提供Endpoint=https://appName.service.signalr.net;AccessKey=xxxxx
设置,但不能从后端提供。
除了安全方面的问题,这还让我质疑SignalR服务的目的是什么。
当然,必须有更好的方法从后端调用Signalr。
非常感谢,
汤姆
答案 0 :(得分:0)
在Startup.cs中,您必须有一行这样的代码
services.AddSignalR().AddAzureSignalR();
通过不将参数传递给AddAzureSignalR()
,此代码将默认配置密钥Azure:SignalR:ConnectionString
用于SignalR Service资源连接字符串。
您可以在此article
中找到更多信息