SignalR Core似乎不尊重Newtonsoft的TypeNameHandling设置

时间:2019-12-04 21:11:21

标签: json json.net signalr asp.net-core-signalr

我正在绕过从一个普通类派生的类。我发现,尽管传递了反序列化有效数据,但集线器仍不遵守TypeNameHandling并完全忽略了JSON的$​​ type。无论我尝试什么,它都会反序列化为基类。

我去了一个事件,拿走了我发送到集线器的JSON,将它作为字符串粘贴到集线器代码中,然后使用JsonConvert.Deserialize查看会发生什么并将其正确反序列化到我的派生对象。

在我的创业公司中,我有

JsonConvert.DefaultSettings = () => new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.Auto
            };

我不确定是否真的在使用它,所以我创建了一个测试JSON转换器,并在CanRead属性(我返回了一个静态false)上进行了调试。受到打击。这也使我的字符串反序列化工作。

那么集线器在做什么,除了集线器之外,其他所有功能似乎都能正常工作?

1 个答案:

答案 0 :(得分:1)

  

尽管传递反序列化有效数据,但集线器不遵守TypeNameHandling并完全忽略JSON的$​​ type。无论我尝试什么,它都会反序列化为基类。

我使用以下代码段进行了测试,这些代码段对我有用,您可以参考它。

在启动中:

services.AddSignalR().AddJsonProtocol(options => {
    options.PayloadSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
    {
        TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
    };
});

集线器方法:

public async Task SendMessage1(Business mes)
{
    //code logic here
    //...
}

类:

public abstract class Business
{
    public string Name { get; set; }
}

public class Hotel : Business
{
    public int Stars { get; set; }
}

在客户端上,将以下JSON数据发送到上述中心方法:

var ht = { "$type": "MyNamespaceHere.Hotel, NotesRTMSignalR", "Stars": 4, "Name": "Hudson Hotel" };

测试结果:

enter image description here