【问题标题】:Azure SignalR Service | Asp.Net Web Api | Console clientAzure SignalR 服务 | Asp.Net Web API |控制台客户端
【发布时间】:2019-08-26 01:00:03
【问题描述】:

我能够使用其访问密钥从 Asp.Net Web 应用程序连接到 Azure SignalR 服务。 Asp.Net Web App 通过 Azure SignalR 服务创建和托管一个集线器。我创建了一个 c# 控制台客户端并使用 Microsoft.AspNetCore.SignalR.Client 库连接到 Asp.Net Web 应用程序的 SignalR Hub。

问题:

  1. 我是否应该始终实现像 Asp.Net Web 应用程序这样的中间件并依靠它来创建和通过 Hub 进行通信? 是的,根据 Samara 和其他来源,我们有几个选择。

    • 使用控制台应用程序中的 REST API 来托管集线器 (Azure SignalR) 作为服务器,并将客户端\订阅者作为门户提供服务。这支持单向消息传递。
    • 使用 Azure Functions 中的 REST API(使其无服务器)将集线器 (Azure SignalR) 作为服务器托管,并将客户端\订阅者作为门户提供服务。这支持单向消息传递。
    • 从带有 auth() 层的 Asp.Net 托管 Web API 托管集线器 (Azure SignalR),并通过 API 满足客户端的需求。这支持完整的双向消息传递。
  2. 是否可以从 c# 控制台直接与 Azure SignalR 服务对话以创建集线器并通过集线器发送我的消息?

    • 使用控制台应用程序中的 REST API 来托管集线器 (Azure SignalR) 作为服务器,并将客户端\订阅者作为门户提供服务。这支持单向消息传递。
    • 使用 Azure Functions 中的 REST API(使其无服务器)将集线器 (Azure SignalR) 作为服务器托管,并将客户端\订阅者作为门户提供服务。这支持单向消息传递。

我是 Azure SignalR 服务的新手;请协助我解决上述问题。我的问题几乎得到了解答。希望对您有所帮助!

附:人们没有真正的答案,远离

【问题讨论】:

  • 您可以使用任何类型的项目来实现您的目标。 SignalR 只是一个实现 websocket 连接的系统,通常与 web 服务结合使用,但这不是必需的。
  • 因此,我从控制台客户端找到了一个名为“无服务器”的 github 项目示例。它与 Azure SignalR 服务对话以创建集线器,将消息广播给单个用户到所有用户。但个人用户无法向 Hub 发布消息。如何使它像聊天应用程序一样使两个数据同步。
  • @SamaraSoucy-MSFT,Azure SignalR 服务与 Asp.Net 应用程序和控制台客户端的集成似乎彼此大不相同。与 SignalR 的集成并非无缝。
  • @SamaraSoucy-MSFT,提前感谢您的帮助!

标签: c# azure signalr signalr-hub


【解决方案1】:

我想我更能理解你的问题。我想你在这里谈论示例代码? https://github.com/aspnet/AzureSignalR-samples/tree/master/samples/Serverless

如果您想制作一个聊天应用程序,您可以修改代码以结合这两个功能。我可以通过更新 program.cs 来运行这两个代码集来做到这一点。它不是一个完整的聊天客户端 - 所有消息仍然表示它们来自其他用户,但我希望它能让您更好地了解它是如何工作的。

    app.Command("client", cmd =>
    {
        cmd.Description = "Start a client to listen to the service";
        cmd.HelpOption("--help");

        var userId = cmd.Argument("<userId>", "Set User ID");

        cmd.OnExecute(async () =>
        {
            var connectionString = connectionStringOption.Value() ?? configuration["Azure:SignalR:ConnectionString"];

            if (string.IsNullOrEmpty(connectionString) || !hubOption.HasValue())
            {
                MissOptions();
                return 0;
            }

            var client = new ClientHandler(connectionString, hubOption.Value(), userId.Value);

            await client.StartAsync();

//Add the server to the client so we can talk both ways
            var server = new ServerHandler(connectionString, hubOption.Value());
            await server.Start();


            Console.ReadLine();
            await client.DisposeAsync();

            return 0;
        });
    });

有一些事情需要记住,以及为什么这些示例中的大多数都在 SignalR 服务之上添加了一个 API 层。为了创建与服务的连接,您正在使用密钥。如果您将其嵌入到您的控制台应用程序中然后分发它,任何拥有该应用程序的人现在都可以通过提取密钥来控制您的所有集线器。除非您信任所有具有此功能的用户,否则添加 API 层是可行的方法 - 用户向 API 进行身份验证,API 决定他们在集线器上拥有哪些权限。

【讨论】:

  • SamaraSoucy-MSFT,事实证明,就像 SQL Server 或其他后端服务器一样,我们应该创建一个中间件来通过 Azure SignalR Service Hub 交换消息。
  • SamaraSoucy-MSFT,除非我们构建聊天应用程序或便携式应用程序,否则我们可以通过控制台应用程序使用 Azure SignalR 服务。
  • 是的,SamaraSoucy-MSFT。我昨天已经验证了这个样本。无服务器样本是单向的。只有服务器可以向订阅者广播消息。如果在边缘情况下需要,订阅者不能将消息回发到服务器。
  • 我上网的原因。看起来 Azure SignalR 服务 REST API 不允许个人用户或订阅者将消息回发到服务器集线器。
  • 我忘了感谢您的努力!明天我会尝试一个练习并分享结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多