SignalR hub method parameter serialization(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集线器方法参数序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:SignalR集线器方法参数序列化
基础教程推荐
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 如何激活MC67中的红灯 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01