无法连接到 Azure SignalR Hub

Could not connect to Azure SignalR Hub

我正在尝试 post 向 Azure SignalR Hub 发送实时消息。但是我无法连接到我的 Azure SignalR Hub 本身。我尝试了各种解决方案。它没有按预期工作。你能在这里帮助我吗?此版本的 SignalR 客户端没有文档。

public static async Task BroadcastMessageAsync()
{
    var signalrUrl = "https://myazuresignalr.service.signalr.net";
    var hubConnection = new HubConnection(signalrUrl);
    hubConnection.Credentials = CredentialCache.DefaultNetworkCredentials;
    hubConnection.Closed += async () =>
    {
        await hubConnection.Start();
    };

    var hubProxy = hubConnection.CreateHubProxy("chat");

    hubProxy.On<string, string>("ReceiveMessage", (user, message) =>
    {
        Console.WriteLine(user + " | " + message);
    });

    try
    {
        await hubConnection.Start();
        Console.WriteLine("Connection started");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    await hubProxy.Invoke("SendMessage", "user", "message").ConfigureAwait(false);
}

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.client.hubconnection?view=aspnetcore-2.2

Remarks A HubConnection should be created using HubConnectionBuilder. Before hub methods can be invoked the connection must be started using StartAsync(CancellationToken). Clean up a connection using StopAsync(CancellationToken) or DisposeAsync().

样本

HubConnection _connection = new HubConnectionBuilder()
                .WithUrl(url, option =>
                {
                    option.AccessTokenProvider = () =>
                    {
                        return Task.FromResult(//// Access Token ///);
                    };
                }).Build();

看看这些样本

https://github.com/aspnet/AzureSignalR-samples/tree/master/samples

看起来,毕竟来自 Microsoft.AspNetCore.SignalR.Client 的 HubConnection 旨在连接到在中间件管理的 SignalR Hub,例如 Asp.Net Web App\ Api。它不打算连接到直接 Azure SignalR 服务终结点。

错误:

var signalrUrl = "https://myazuresignalr.service.signalr.net";

正确:对于聊天客户端

var signalrUrl = "https://myazuresignalr.service.signalr.net/client/?hub=yourHubName";

正确:对于聊天服务器

var signalrUrl = "https://myazuresignalr.service.signalr.net/api/v1/hubs/yourHubName

现在,我可以使用其访问密钥从 Asp.Net Web 应用程序连接到 Azure SignalR 服务。 Asp.Net Web App 在 Azure SignalR 服务上创建并托管一个中心。从 c# 控制台应用程序,我正在连接到 Asp.Net 应用程序以与 Azure SignalR 服务对话。

Azure SignalR 服务表面上没有明确的文档来声明客户端库正在使用 REST API 版本的 SignalR。

希望能帮助到别人!

总结一下,

  1. 我是否应该始终实现像 Asp.Net Web 应用程序这样的中间件,并依靠它来创建和讨论 Hub?是否无法从 c# 控制台直接与 Azure SignalR 服务对话以创建集线器并通过集线器发送我的消息?

    [OP]:不,不总是。除了我上面写的,还有另一种解决方案。这个 tutorial 帮助我通过 REST API.

  2. 直接与 Azure SignalR 服务对话

-更新-

  1. 使用任何服务器端语言为 Azure Signal Service 创建中央集线器(我选择,Asp.Net Web API) .这是让 Web API 这样的中间人在 post 到 Azure SignalR 服务之前授权客户端请求的最佳做法。此外,从客户端屏蔽 Azure SignalR 连接字符串。

  2. 通过 HubConnectionBuilder 库使用 JS、TS、.Net 控制台等任何客户端语言创建客户端应用程序(消息接收器,大部分时间) ,..

  3. 通过 Azure SignalR 连接字符串创建消息广播应用程序以通过 Azure SignalR 服务发送信号。

  4. 服务器可以post Hub 上的任何新信号事件,而客户端可以监听那些动态事件,前提是客户端订阅了这些动态事件。

  5. 当 Web API 实现该事件时,客户端只能通过 Web API Central Hub post 发出信号。