acc*_*777 6 c# signalr asp.net-core
我目前正在使用 SignalR Core 开发 ASP.NET Core 2 应用程序。我想知道是否可以在 Hub 类中接收复杂的对象,而不是简单的字符串或简单的数据结构。
有效 - 这个例子工作正常:string message
public class MyHub : Hub
{
public Task SendMessage(string message)
{
// ... some logic
}
}
Run Code Online (Sandbox Code Playgroud)
有效 - 这个例子也很好用:List<Dictionary<string, object>> message
public class MyHub : Hub
{
public Task SendMessage(List<Dictionary<string, object>> message)
{
// ... some logic
}
}
Run Code Online (Sandbox Code Playgroud)
无法正常工作 - 似乎我无法通过 SignalR 传输复杂对象,例如,如果我创建自定义消息类:
public class Message
{
public int MessageId { get; set; }
public List<Dictionary<string, object>> Items { get; set; }
public List<string> TextMessages { get; set; }
}
public class MyHub : Hub
{
public Task SendMessage(Message message)
{
// ... some logic
}
}
Run Code Online (Sandbox Code Playgroud)
您知道如何通过 SignalR RPC 传输复杂对象吗?
谢谢你!
您可以使用 Newtonsoft.Json Nuget。
\n\n那里有一个 JsonConverter 可以序列化你的对象。
\n\n所以在你的例子中:
\n\n public class MyHub : Hub\n {\n public Task SendMessage(Message message)\n {\n var messageJsonString = JsonConvert.SerializeObject<Message>(message);\n // some logic\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n在您的客户端上,您可以将其转换回对象。它\xc2\xb4s有一个原生API,所以你只需调用
\n\nconnection.on("ReceiveMessage", (message) => { \n let messageObject = JSON.parse(message);\n // Other code here\n});\nRun Code Online (Sandbox Code Playgroud)\n\n现在消息又是您从服务器发送的对象。
\n\n当然,您可以将从JsonConvert.DeserializeObject<T>()客户端收到的 json 字符串转换为对象。
请按照以下步骤进行在 signalR 客户端和服务器之间传递的工作演示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;
}
}
Run Code Online (Sandbox Code Playgroud)客户
private static async void Connect()
{
var hubConnectionBuilder = new HubConnectionBuilder();
#region Worked
var hubConnection = hubConnectionBuilder.WithUrl("https://localhost:44381/timeHub", options =>
{
}).Build();
#endregion
await hubConnection.StartAsync();
await hubConnection.SendAsync("UpdateTime", $"From Client");
var item1 = new Dictionary<string, object> {
{ "T1", new { Name = "TT1" } },
{ "T2", new { Name = "TT2" } },
{ "T3", new { Name = "TT3" } },
};
var item2 = new Dictionary<string, object> {
{ "T11", new { Name = "TT11" } },
{ "T12", new { Name = "TT12" } },
{ "T13", new { Name = "TT13" } },
};
await hubConnection.SendAsync("SendMessage", new Message {
MessageId = 1,
Items = new List<Dictionary<string, object>> {
item1,
item2
},
TextMessages = new List<string> {
"H1",
"H2"
}
});
var on = hubConnection.On("ReceiveMessage", OnReceivedAction);
Console.WriteLine($"Client is Start");
Console.ReadLine();
on.Dispose();
await hubConnection.StopAsync();
}
Run Code Online (Sandbox Code Playgroud)