【问题标题】:SignalR : use camel caseSignalR:使用驼峰式案例
【发布时间】:2015-07-12 09:20:40
【问题描述】:

我想知道是否有办法配置 SignalR,以便集线器中的客户端函数使用驼峰式大小写返回对象。

谢谢。

【问题讨论】:

    标签: serialization json.net signalr deserialization


    【解决方案1】:

    滚动你自己的合约解析器

    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(Connection).Assembly;
        }
    
        public JsonContract ResolveContract(Type type)
        {
            if (type.Assembly.Equals(assembly))
            {
                return defaultContractSerializer.ResolveContract(type);
    
            }
    
            return camelCaseContractResolver.ResolveContract(type);
        }
    
    }
    

    像这样注册

    var settings = new JsonSerializerSettings();
    settings.ContractResolver = new SignalRContractResolver();
    var serializer = JsonSerializer.Create(settings);
    GlobalHost.DependencyResolver.Register(typeof (JsonSerializer), () => serializer);
    

    如果您使用自定义 IoC,您可能会遇到问题,因为 JsonSerializer 是一种具体类型,并且某些 IoC(例如 Ninject)会注入未绑定的具体类型。在 Ninjects 的情况下,解决方案是将其注册到 Ninject 而不是 SignalR 自己的DependencyResolver

    var settings = new JsonSerializerSettings();
    settings.ContractResolver = new SignalRContractResolver();
    var serializer = JsonSerializer.Create(settings);
    kernel.Bind<JsonSerializer>().ToConstant(serializer);
    

    我的博客上的更多信息: http://andersmalmgren.com/2014/02/27/why-overriding-jsonserializer-no-longer-work-in-signalr-2-0/

    【讨论】:

    • 您知道如何在 ASP.NET 5 / SignalR 3 中进行相同的配置吗? GlobalHost 现在被新风格的依赖注入所取代...
    • 抱歉,还没有看过 SignalR 3,将不得不这样做
    • 没有可用的 SignalR 预发行版?
    • 对于遇到“您使用的客户端版本与服务器不兼容。客户端版本 1.5,服务器版本未定义”的任何人。升级 SignalR 时出错,请查看此答案。实际上是我的问题的原因(我使用添加序列化程序设置的“旧”方法)。
    • 注册在哪里进行?它在 Startup.cs 中吗?
    【解决方案2】:

    安德斯的答案是正确的;我只是想补充一点,对于使用 AutoFac 而不是 Ninject 的任何人,您应该在 startup.cs 中使用此注册:

    var settings = new JsonSerializerSettings();
    settings.ContractResolver = new SignalRContractResolver();
    var serializer = JsonSerializer.Create(settings);
    builder.RegisterInstance(serializer).As<JsonSerializer>();
    

    【讨论】:

      【解决方案3】:

      要与 ASP .NET Core 一起使用,您可以像这样在 Startup -> ConfigureServices 中注册 JsonSerializer:

      var settings = new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() };
      var serializer = JsonSerializer.Create(settings);
      services.AddSingleton(serializer);
      

      【讨论】:

        【解决方案4】:

        为 asp.net 核心配置 signalR 序列化设置的正确方法是:

        // Inside your Startup.ConfigureServices
        
        var settings = new JsonSerializerSettings
        {
            // ... your serialization settings 
        };
        
        services.AddOptions<JsonHubProtocolOptions>()
                .Configure(x => x.PayloadSerializerSettings = settings);
        

        【讨论】:

          【解决方案5】:

          如果您不想干预 SignalR 配置或发现它太麻烦,您可以添加 JsonProperty 属性来指定模型序列化后的属性名称。 JsonProperty 来自 JSON.NET,SignalR 使用它进行序列化。

              [JsonProperty("id")]
              public byte Id { get; set; }
          
              [JsonProperty("name")]
              public string Name { get; set; }
          

          【讨论】:

          • 这更麻烦,每次你要更改模型时,你都必须更改那些硬编码的字符串
          猜你喜欢
          • 2020-11-12
          • 1970-01-01
          • 1970-01-01
          • 2019-04-03
          • 2015-12-06
          • 2013-09-29
          • 2020-02-01
          • 1970-01-01
          • 2019-10-17
          相关资源
          最近更新 更多