在.NET Console Client App中使用ASP.NET Core SignalR接收来自Azure SignalR的消息

时间:2019-04-23 15:22:20

标签: c# azure signalr.client asp.net-core-signalr azure-signalr

我正在学习SignalR,但遇到了障碍。

我有一个Azure功能,该功能已成功发布到Azure SignalR托管服务(在无服务器模式下配置)

我一直在关注此快速入门:

Quickstart: Create a chat room with Azure Functions and SignalR Service using C#

我想要实现的实际上是将来自服务器的消息接收到我的客户端应用程序中。作为原型,我创建了一个控制台应用程序。

我添加了以下Nuget程序包

  

Microsoft.AspNetCore.SignalR.Client-版本1.1.0   Microsoft.Azure.WebJobs.Extensions.SignalRService

所有基础结构似乎都运行良好-我基于这样的假设,即可以在以下地址运行演示网站,将其指向我的本地实例(或托管在Azure中的实例) https://azure-samples.github.io/signalr-service-quickstart-serverless-chat/demo/chat-v2/

我的AzureFunction发布的消息直接发布到聊天窗口中。

如何获取这些消息以打印到控制台?

using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using System;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.ReadKey();

            var connection = new HubConnectionBuilder().WithUrl("http://localhost:7071/api").Build();


            connection.On<SignalRMessage>("newMessage", (message) =>
            {
                Console.WriteLine(message.Arguments);
            });


            connection.On("newMessage", (string server, string message) =>
            {
                Console.WriteLine($"Message from server {server}: {message}");
            }
  );
            await connection.StartAsync();
            Console.ReadKey();
        }
    }
}

我强烈怀疑我的问题与

有关
  

connection.On <...>

声明。他们从不开火。 Connection.StartAsync()似乎可以正常工作,并建立与Azure SignalR实例的连接。

我缺少一些基本要点吗?我现在只是在挣扎。

简而言之-有人可以给我一个指向我的控制台窗口的“接收和写入”消息的指针-就像消息是在网络聊天演示中打印到Web浏览器一样(请参见上面的第二个链接)。

消息是我想发送给所有连接的客户端的简单广播消息。

几乎所有示例都使用Javascript。

谢谢。

2 个答案:

答案 0 :(得分:0)

一旦我发现如何将日志添加到SignalR,我可以看到它无法解析正在发送的类型。

更改连接后它就可以正常工作。

connection.On<CorrectType>("newMessage", (message) =>
            {
                Console.WriteLine(message.stringproperty);
            });

通过查看文章Azure Functions development and configuration with Azure SignalR Service

,我的想法被误导了

在他们“似乎”(我不介意)的地方,向SignalR添加类型为“ SignalRMessage”的消息。实际上,他们正在添加“ CorrectType”消息类型

CorrectType message
signalRMessages.AddAsync(
    new SignalRMessage
    {
        // the message will only be sent to these user IDs
        UserId = "userId1",
        Target = "newMessage",
        Arguments = new [] { message }
    });

答案 1 :(得分:0)

我设法通过在调用“ connection.On”时传入“对象”来解决该问题,而不必创建CorrectType类,然后让.net弄清楚该对象的外观。

确实是该类型的解析导致.On无法在Windows客户端上触发。