如何通过 SignalR 传递复杂对象?

Posted

技术标签:

【中文标题】如何通过 SignalR 传递复杂对象?【英文标题】:How to pass complex objects via SignalR? 【发布时间】:2013-06-25 09:26:16 【问题描述】:

SignalR 上有一个很好的教程,它解释了如何将 .NET 对象作为参数传递给 javascript,反之亦然。在这种情况下,它会往来传递一个ChatMessage 对象。

但是,本教程涉及一个非常简单的对象。我想看看如何在 Javascript 中处理复杂的 .NET 对象(具有其他对象作为属性)。

例如,考虑以下对象:

class Master 
    public List<QuarterHour> QuarterHours  get; set; 
    public List<string> Books  get; set; 
    public int EndDay  get; set; 
    public int StartDay  get; set; 


class QuarterHour 
    public MinuteInstance Minute get; set;
    public int HourStart  get; set;


class MinuteInstance  
    public bool Registered get; set;
    public int NumAttendees get; set;

在 .NET 中,我可以引用如下值:master.QuarterHours[2].Minute.Registered。我的问题:

    如何在 Javascript 端的接收器方法中引用 master.QuarterHours[2].Minute.Registered? 如何在 Javascript 中构建 Master 对象以发送到 .NET 端?

【问题讨论】:

它将被序列化并转换为 JSON 对象,就像您在操作中使用 JsonResult 一样。 别忘了让你的课程公开!! 【参考方案1】:
    您只需发送它并以相同的方式引用它。 你会通过(这是从服务器获取它时的样子):

    QuarterHours: [
        Minute: 
            Registered: true,
            NumAttendees: 1337
        ,
        HourStart: 1
    ],
    Books: ["Game of Thrones", "Harry Potter"],
    EndDay: 2,
    StartDay: 3

【讨论】:

我刚刚将我的有效负载从 更改为(简单)复杂类型,它不再起作用,集线器中的发送方法不像以前那样被调用。没有错误,什么都没有。你有什么想法?公共异步任务 SendCommonMessage(CommonMessage commonMessage)【参考方案2】:

您可能希望将您的类序列化为 JSON 对象。有很多方法可以做到这一点,但您可以尝试JSON.NET 来快速轻松地做到这一点。

如果它尚未包含在您的项目中,您可以通过 Nuget 添加它:

Install-Package Newtonsoft.Json 

代码如下所示:

var json = JsonConvert.SerializeObject(master);

一旦将其传递到您的客户端,您就可以像读取任何其他对象一样从您的 JSON 对象中读取数据。您可以使用以下 javascript 代码将 SignalR 字符串消息转换为 JSON 对象:

var master = JSON.stringify(eval("(" + message + ")"));
var registered = master.QuarterHours[2].Minute.Registered;

您还可以通过 SignalR 将其传递到服务器并使用 JsonConvert.DeserializeObject 反序列化 JSON 对象,以便将其转换为您的 C# 类。在此处查看文档以获取更多详细信息:http://james.newtonking.com/projects/json/help/

【讨论】:

问题是如何将复杂对象传递给 singalR,而不是如何序列化对象。 ...一种解决方案是将对象序列化为 JSON。 如果有发送复杂对象的本机方式(如其他答案中所述),使用序列化并不是真正的“好”解决方案,而是一种解决方法 - 特别是因为似乎序列化是什么SignalR 在内部做......所以基本上你正在重写库的一部分。 我刚刚使用 SignalR 发送了一个 .NET 对象。客户端js接收一个结构相同的js对象。我根本不需要序列化它。确保属性是公开的! 你不需要手动序列化signalR中的对象。它已经在信号器库中实现了

以上是关于如何通过 SignalR 传递复杂对象?的主要内容,如果未能解决你的问题,请参考以下文章

SignalR

在 ASP.NET Core 中使用 SignalR

通过查询字符串传递“承载”时,SignalR 身份验证失败

如何使 SignalR 承载身份验证安全或如何不记录查询字符串

如何将数据传递到 Signalr 集线器类

从用 C 语言编程的微控制器客户端使用 SignalR(或任何 WebSockets 框架)服务器