提问者:小点点

SignalR未序列化/反序列化自定义DataMember名称


我正在做一个项目,试图将SignalR融入其中。 我有一个带有数据契约的类,它允许我在客户机上使用下划线分隔格式,在服务器上使用标准Pascal大小写,如下所示:

[DataContract]
public class Foo {

    [DataMember(Name = "first_name")]
    FirstName { get;set; }

    [DataMember(Name = "last_name")]
    LastName { get;set; }

    [DataMember(Name = "phone")]
    Phone { get;set; }
}

当通过fetch命令将数据传递给Razor页面OnGet和OnPost方法时,这可以很好地工作,但当使用SignalR时就不工作了。

通过SignalR向服务器发送数据时,first_namelast_name为空,而phone正确发送。

如何使SignalR在序列化/反序列化时尊重datamember名称?


共1个答案

匿名用户

我认为当前您正在将数据作为一个对象发送,不知何故,如下所示:

Foo foo = new Foo();
_hub.Clients.All.InvokeAsync("ReceiveMessage", foo);

我建议您在服务器端手工创建JSON并发送,因为这样可以更好地控制属性名。

JSONProperty属性添加到foo类:

[DataContract]
public class Foo {

    [DataMember(Name = "first_name")]
    [JsonProperty("first_name")]
    FirstName { get;set; }

    [DataMember(Name = "last_name")]
    [JsonProperty("last_name")]
    LastName { get;set; }

    [DataMember(Name = "phone")]
    [JsonProperty("phone")]
    Phone { get;set; }
}

当您发送消息时,发送JSON字符串,而不是让SinglaR解析您的对象:

Foo foo = new Foo();
string json = JsonConvert.SerializeObject(foo);
_hub.Clients.All.InvokeAsync("ReceiveMessage", json);