SignalR :使用驼峰大小写

SignalR : use camel case

我想知道是否有配置 SignalR 的方法,以便客户端在集线器 return 对象中使用驼峰式大小写功能。

谢谢。

一样滚动你自己的合同解析器
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 将注入未绑定的具体类型。在 Ninject 的情况下,解决方案是使用 Ninject 注册它,而不是使用 SignalRs 自己的 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/

安德斯回答正确;我只是想为使用 AutoFac 而不是 Ninject 的任何人补充一点,您应该在 startup.cs:

中使用此注册
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();

为了与 ASP .NET Core 一起使用,您可以像这样在 Startup -> ConfigureServices:

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

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

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

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

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

// Inside your Startup.ConfigureServices

var settings = new JsonSerializerSettings
{
    // ... your serialization settings 
};

services.AddOptions<JsonHubProtocolOptions>()
        .Configure(x => x.PayloadSerializerSettings = settings);