【问题标题】:How to trigger a SignalR command outside of the front end如何在前端之外触发 SignalR 命令
【发布时间】:2019-04-18 12:43:56
【问题描述】:

我觉得我要么错过了 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 服务在这方面的用途。

肯定有更好的方法从后端调用信号器。

非常感谢,

汤姆

【问题讨论】:

  • “但不是来自后端”,这不是每个人都想要的吗?它是相同的后端应用程序(相同的操作系统进程),那么为什么要访问密钥?我在这里没有看到安全问题。

标签: c# asp.net azure signalr signalr-service


【解决方案1】:

在 Startup.cs 中你必须有这样一行代码

services.AddSignalR().AddAzureSignalR();

通过不向AddAzureSignalR() 传递参数,此代码使用默认配置键Azure:SignalR:ConnectionString 作为SignalR 服务资源连接字符串。

你可以在这个article找到更多信息

【讨论】:

  • 我应该更具体的抱歉 - 这是 asp.Net 4.7.1 而不是 Core。我认为 Core 的语法是 .AddAzureSignalR(),而 .net 的语法是 .MapAzureSignalR()。我在 webconfig 中有我的端点连接字符串,名称为 Azure:SignalR:ConnectionString,这为我提供了前端到前端的安全性。
  • 实际上,您的集线器位于前端 - 前端之间。这基本上意味着,您的两个前端都通过连接字符串连接到您的集线器。
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2021-01-27
相关资源
最近更新 更多