SignalR Core, похоже, не соблюдает настройку TypeNameHandling от Newtonsoft.

Я передаю классы, которые происходят от общего класса. Я обнаружил, что, несмотря на передачу действительных данных десериализации, концентратор не учитывает TypeNameHandling и полностью игнорирует $type JSON. Он десериализуется в базовый класс независимо от того, что я пытаюсь сделать.

Я пошел и взял JSON, который я отправлял в концентратор, вставил его в код концентратора в виде строки, затем использовал JsonConvert.Deserialize, чтобы увидеть, что произойдет, и он правильно десериализовался в мой производный объект.

В моем стартапе у меня есть

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

Я не был уверен, что это действительно используется, поэтому я создал тестовый конвертер JSON и поместил отладку в свойство CanRead (которое я вернуло статическое значение false). Это попало. Это также позволило моей десериализации строк работать.

Так что же делает концентратор по-другому, что все работает, кроме концентратора?


person Matt M    schedule 04.12.2019    source источник


Ответы (1)


несмотря на передачу действительных данных десериализации, концентратор не учитывает TypeNameHandling и полностью игнорирует $type JSON. Он десериализуется в базовый класс независимо от того, что я пытаюсь сделать.

Я сделал тест со следующим фрагментом кода, который работает для меня, вы можете обратиться к нему.

При запуске:

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" };

Результат теста:

введите здесь описание изображения

person Fei Han    schedule 06.12.2019