在SignalR中序列化/反序列化派生对象

我在.NET客户端使用SignalR 1.1 . 我的集线器中有一个方法接受BaseMessage类的对象并将其广播到所有客户端:

public void SendMessage(BaseMessage message)
{
    Clients.All.BroadCastMessage(message);
}

客户端会将派生消息传递给此方法:

_hub.Invoke("SendMessage", new ErrorMessage("Some Error")).Wait();

客户端有一个消息处理程序:

_hub.On<BaseMessage>("BroadCastMessage", OnMessageReceived);

我在应用程序启动时指定了TypeNameHandling.All序列化程序设置:

var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All};
var serializer = new JsonNetSerializer(settings);
GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);

但是当客户端发送派生消息时,服务器会收到基本消息 .

如何配置序列化程序以便能够接收派生消息?

注意:我可以手动执行序列化/反序列化并将字符串传递给服务器,但这会导致双序列化 .

回答(1)

3 years ago

SignalR不支持此方案,因为它需要您的JSON有效内容包含有关派生类型和程序集的信息 . 见sample . 在您的有效负载中添加类型信息不适合浏览器 . 我建议您创建单独的集线器方法来处理每个派生类型 .