ASP.NET Core 2 SignalR Hub可以接收复杂的对象而不是字符串

时间:2019-01-14 08:16:34

标签: c# asp.net-core signalr

我目前正在使用SignalR Core开发ASP.NET Core 2应用程序。我想知道是否有可能在Hub类中接收复杂的对象,而不是简单的字符串或简单的数据结构。

Works-此示例可以正常工作:function get_all_nodes (Current_Node : in Tree) return Integer_Concatenation.Element_Array is use Integer_Concatenation; use type Element_Array; begin if(Tree_is_null(Current_Node)) then return (1..0 => <>); else return Element_Array'(1 => Get_node_value(Current_Node)) & get_all_nodes(Current_Node.all.parent1) & get_all_nodes(Current_Node.all.parent2); end if; end get_all_nodes;

string message

Works-此示例也可以正常运行:public class MyHub : Hub { public Task SendMessage(string message) { // ... some logic } }

List<Dictionary<string, object>> message

无法正常工作-似乎我无法通过SignalR传输复杂的对象,例如如果我创建一个自定义消息类:

public class MyHub : Hub
{
    public Task SendMessage(List<Dictionary<string, object>> message)
    {
        // ... some logic
    }
}

您知道如何通过SignalR RPC传输复杂对象吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用Newtonsoft.Json Nuget。

您有一个JsonConverter可以序列化您的对象。

在您的示例中:

    public class MyHub : Hub
    {
          public Task SendMessage(Message message)
          {
             var messageJsonString = JsonConvert.SerializeObject<Message>(message);
             // some logic
           }
    }

在客户端上,您可以将其转换回一个对象。它具有nativ API,因此您只需调用

connection.on("ReceiveMessage",  (message) => { 
    let messageObject = JSON.parse(message);
    // Other code here
});

现在消息仍然是您从服务器发送的对象。

当然,您可以使用JsonConvert.DeserializeObject<T>()将您从客户端收到的json字符串转换为Object。

答案 1 :(得分:1)

请按照以下步骤操作演示,以便在signalR客户端和服务器之间传递aCounter.increment() // 1 aCounter.increment() // 2 aCounter.getVal() // 2

  1. 服务器

    Message
  2. 客户端

    public class TimeHub: Hub
    {
        public async Task UpdateTime(string message)
        {
            if (Clients != null)
            {
                await Clients?.All.SendAsync("ReceiveMessage", message);
            }
        }
        public Task SendMessage(Message message)
        {
            // ... some logic
            return Task.CompletedTask;
        }
    }
    

答案 2 :(得分:0)

如果您正考虑使用JSON解析只是为了将多个对象/参数传递给客户端,那么还有另一种选择。

服务器端(C#)。您可以将任意数量的参数传递给匿名对象数组。

SendCoreAsync("MethodName", new object[] {someObject, someNumber, someString });

客户端(打字稿)

private alertHandler = (someObject: any, someNumber: number, someString: string) => {
    console.log(someObject, someNumber, someString);
};

我有一个更详细的答案here