【问题标题】:SignalR Core doesn't seem to respect Newtonsoft's TypeNameHandling settingSignalR Core 似乎不尊重 Newtonsoft 的 TypeNameHandling 设置
【发布时间】:2019-12-04 21:11:21
【问题描述】:

我正在传递从公共类派生的类。我发现,尽管传递了反序列化有效数据,但集线器不尊重 TypeNameHandling 并且完全忽略了 JSON 的 $type。无论我尝试什么,它都会反序列化为基类。

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

在我的创业中,我有

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

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

那么,集线器有什么不同之处,使得除了集线器之外的一切似乎都正常工作?

【问题讨论】:

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


    【解决方案1】:

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

    我用下面的代码sn-p做了一个测试,对我有用,你可以参考一下。

    在启动中:

    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 数据发送到上述 hub 方法:

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

    测试结果:

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多