为什么 SignalR 在序列化字典并将其发送给客户端时将字典键的首字母转换为小写?

Why does SignalR convert the first letters of Dictionary keys to lower case when it serializes the dictionary and sends it to clients?

这是从服务器发送到客户端的内容:

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 核心 2.1

Why does this happen?

"We use camelCase for names in JSON as it fits JavaScript patterns better."
aspnet/SignalR#1415 (comment)

Is there any way to prevent it?

... is there any way to switch this conversion off in SignalR serializer?

是的。

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