为什么 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;
});
这是从服务器发送到客户端的内容:
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;
});