javascript - Signalr hub 未正确序列化其方法参数的属性
问题描述
我有一个配置良好的信号器集线器,并且与客户沟通良好。但是我的 hub 方法接受特定类型的参数,并且表示这种类型的类具有 Pascal 大小写属性。如下所示:
public List<DataChanges> Changes { get; set; }
但是,当客户端(Javascript 客户端)调用此方法时,它会正确传递对象,但是,除非我将属性名称更改为“CamelCase”,否则该对象的属性始终为空。如下所示:
public List<DataChanges> changes { get; set; }
我尝试了什么:
我依次将以下属性添加到对象的属性中,但错误仍然存在。
[DataMember(Name = "changes")]
[JsonProperty("changes")]
在我的启动类中,我添加了 signalr json 协议,如下所示:
.AddNewtonsoftJsonProtocol(options =>
{
//options.PayloadSerializerSettings.ContractResolver = new SignalRContractResolver();
//options.PayloadSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver { NamingStrategy = { OverrideSpecifiedNames = true } };
})
这是 Signalr 合约解析器:
public class SignalRContractResolver : IContractResolver
{
private readonly Assembly _assembly;
private readonly IContractResolver _camelCaseContractResolver;
private readonly IContractResolver _defaultContractSerializer;
public SignalRContractResolver()
{
_defaultContractSerializer = new DefaultContractResolver();
_camelCaseContractResolver = new CamelCasePropertyNamesContractResolver();
_assembly = typeof(Startup).GetTypeInfo().Assembly;
}
public JsonContract ResolveContract(Type type)
{
if (type.GetTypeInfo().Assembly.Equals(_assembly))
return _defaultContractSerializer.ResolveContract(type);
return _camelCaseContractResolver.ResolveContract(type);
}
}
我尝试了其他一些解决方案,但没有任何效果。信号器无法应用骆驼案例序列化,并且我的属性始终为空。
有人可以告诉我一个解决方案吗?
解决方案
您必须在启动项目中添加它: services.AddSignalR().AddJsonProtocol(options => {options.PayloadSerializerOptions.PropertyNamingPolicy = null }
推荐阅读
- javascript - 如何摆脱这种 amCharts 失真?
- javascript - 从经典 asp 使用 asmx webservice 的问题
- ios - iOS BLE 是否可以在存在其他相同类型的其他外围设备的情况下选择性地连接到给定的外围设备
- angular - 错误:无法解析所有参数
,但相同的服务在其他组件中也能正常工作? - c# - WPF 页面如何保存在内存中?
- c# - 反序列化嵌套 JSON
- javascript - Typescript:如何在 Redux 中键入 Dispatch
- angular - Angular 6:观察嵌套对象的属性
- java - 删除流程实例后在 Camunda 中执行一些块
- php - php准备好的语句:唯一的用户名和电子邮件错误