我目前正在使用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传输复杂对象吗?
谢谢!
答案 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
。
服务器
Message
客户端
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