Почему SignalR преобразует первые буквы ключей словаря в строчные, когда он сериализует словарь и отправляет его клиентам? - PullRequest
0 голосов
/ 05 июня 2018

Это то, что отправляется с сервера клиенту:

public class BattleHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        await Clients.Client(Context.ConnectionId).SendAsync("ConfigurationInfo",
            new Dictionary<string, string> { { "WtF", "WtF" } });

        await base.OnConnectedAsync();
    }
}

Это то, что получает клиент:

{"wtF":"WtF"}

Как свидетельствует следующий код клиента:

const battle_connection = new signalR.HubConnectionBuilder().withUrl("/battlehub").build()

battle_connection.on("ConfigurationInfo", (bigDict) => {
    window.alert(JSON.stringify(bigDict))
})

Обратите внимание на изменение регистра в первой букве ключа словаря?«WtF» должен был быть отправлен, но вместо него отправлено «wtF».

Почему это происходит?Есть ли способ предотвратить это?

Любопытно, что это происходит только с ключами словаря: как видите, значения остаются неизменными.Кроме того, отправка только одной строки, не заключенной в словарь, не приводит к тому, что первая буква переводится в нижний регистр.List<string> также отправляется правильно.

Регистр всех букв всех ключей здесь действительно имеет значение, поэтому он делает приложение неправильным, если какая-либо из них принудительно преобразуется в нижний регистр!Хотя, конечно, мы можем придумать много более или менее безобразных способов обойти эту проблему, есть ли способ отключить это преобразование в сериализаторе SignalR?

ASP .NET Core 2.1

1 Ответ

0 голосов
/ 05 июня 2018

Почему это происходит?

"Мы используем camelCase для имен в JSON, поскольку он лучше соответствует шаблонам JavaScript."
- aspnet/ SignalR # 1415 (комментарий)

Есть ли способ предотвратить это?

... есть ли способ отключить это преобразование в сериализаторе SignalR?

Да.

services
    .AddSignalR()
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
    });
...