我正在做一个项目,试图将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_name
和last_name
为空,而phone
正确发送。
如何使SignalR在序列化/反序列化时尊重datamember
名称?
我认为当前您正在将数据作为一个对象发送,不知何故,如下所示:
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);