首页 > 解决方案 > 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);
    }

}

我尝试了其他一些解决方案,但没有任何效果。信号器无法应用骆驼案例序列化,并且我的属性始终为空。

有人可以告诉我一个解决方案吗?

标签: javascriptc#.net-coresignalrasp.net-core-signalr

解决方案


您必须在启动项目中添加它: services.AddSignalR().AddJsonProtocol(options => {options.PayloadSerializerOptions.PropertyNamingPolicy = null }


推荐阅读