SignalR:使用驼峰盒

daf*_*key 25 serialization json.net deserialization signalr

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

谢谢.

And*_*ers 54

滚动你自己的Conttract解析器就像

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

注册就好

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

如果您使用自定义IoC,您可能遇到问题,因为它JsonSerializer是一种具体类型,而某些IoC(例如Ninject)将注入未绑定的具体类型.在Ninjects案例中,解决方案是使用Ninject而不是SignalRs自己注册它DependencyResolver

var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
kernel.Bind<JsonSerializer>().ToConstant(serializer);
Run Code Online (Sandbox Code Playgroud)

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

  • 对于任何遇到"您正在使用与服务器不兼容的客户端版本.客户端版本1.5,服务器版本未定义"的人.升级SignalR时出错,请看这个答案.实际上是我的问题的原因(我使用添加序列化设置的"旧"方法). (3认同)

Joh*_*lly 5

安德斯的回答是正确的; 我只是想为使用AutoFac而不是Ninject的任何人添加它,你应该在你的注册中使用这个注册startup.cs:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();
Run Code Online (Sandbox Code Playgroud)