SignalR集线器方法参数序列化 [英] SignalR hub method parameter serialization

查看:27
本文介绍了SignalR集线器方法参数序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要来自SignalR开发人员的一些指导,调整集线器方法的参数序列化的最佳方式是什么。

我开始将我的项目从WCF轮询双工(Silverlight5-ASP.NET4.5)迁移到SignalR(1.1.2)。消息(数据协定)基于接口是多态的。(就像iMessage、MessageA:iMessage等--实际上有一个由类实现的接口层次结构,但对于这个问题来说意义不大)。 (我知道多态对象对客户端不好,但客户端会将其作为JSON处理,如果是.NET/Silverlight,则只在服务器端或客户端映射到对象)

在集线器上,我定义的方法如下:

public void SendMessage(IMessage data) { .. }

我创建了自定义JsonConverter,并验证了可以使用Json.NET序列化/反序列化消息。然后,我用正确的设置替换了DependencyResolver中的JsonNetSerializer。同样,在Silverlight客户端也是如此。到目前为止还不错。

但是,当我将消息从客户端发送到服务器时(消息被正确序列化为JSON-在Fiddler中进行了验证),服务器返回参数无法反序列化的错误。 在调试器的帮助下,我在SignalR中发现了一个bug(负责参数反序列化的JRawValue类在内部创建了自己的JsonSerializer实例,忽略了提供的实例)。通过替换

似乎相当容易解决
var settings = new JsonSerializerSettings
{
    MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);

var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);

但我还发现接口IJsonSerializer将在未来版本的SignalR中删除。基本上,我需要的是从集线器方法获取原始JSON(或字节流),以便我可以自己对其进行反序列化,或者可以通过指定转换器等来调整序列化程序。

目前,我最后使用JObject参数类型定义方法:

public void SendMessage(JObject data)

然后使用

手动反序列化数据
JObject.ToObject<IMessage>(JsonSerializer)

方法。但我更喜欢定制序列化程序,并将类型/接口放在集线器方法上。关于下一个SignalR的设计,"正确的方式"是什么?

我还发现有可能将我的代码中的原始JSON发送回客户端是很有用的,也就是说,这样SignalR就不会再次序列化该对象。我如何才能做到这一点?

推荐答案

如果您使用的是Connection API而不是Hub API,则可以将OnReceive事件和GET请求作为原始JSON(String)来处理。查看this example

使用集线器API向客户端发送预串行化数据的功能是在2.x版本中添加的,我不知道在1.x中有什么方法可以做到这一点(请参阅github issue)

这篇关于SignalR集线器方法参数序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆