无法连接到Azure SignalR集线器

时间:2019-04-03 10:53:08

标签: c# azure signalr

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

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);
}

2 个答案:

答案 0 :(得分:1)

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

  

备注应使用HubConnectionBuilder创建HubConnection。   在调用集线器方法之前,必须使用以下命令启动连接   StartAsync(CancellationToken)。使用清理连接   StopAsync(CancellationToken)或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

答案 1 :(得分:1)

毕竟,看起来像来自Microsoft.AspNetCore.SignalR.Client的HubConnection旨在连接到在诸如Asp.Net Web App \ Api之类的中间件上管理的SignalR Hub。它不打算连接到直接的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服务表面上没有清晰的文档来声明客户端库正在使用SignalR的REST API版本。

希望它可以帮助和帮助别人!

总结

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

    [OP]:不,并非总是如此。除了我上面写的内容以外,还有另一种解决方案。 tutorial可以帮助我直接通过REST API与Azure SignalR服务进行对话。

-更新-

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

  2. 使用任何客户端语言(包括JS,TS,.Net控制台等),通过HubConnectionBuilder库创建客户端应用程序(大多数情况下为消息接收器)。

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

  4. 服务器可以通过集线器发布任何新的信号事件,而客户端可以侦听那些动态事件,前提是客户端已订阅这些动态事件。

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