SignalR and camelCase data contracts
I really like SignalR for its capability to do push notifications from the server to the client. But there are a few thing in SignalR I am not quite happy with. Fortunately SignalR is really pluggable and you can change it to suit your needs. :-)
PascalCase versus camelCase
With functions defined on a SignalR Hub this is no problem. SignalR does the right thing and converts them from the server side PascalCase to the client side camelCase so everyone is happy.
However with the data passed as arguments this is not the case and they are passed as is. It turns out SignalR is using JSON.NET which is a really powerful JSON serializer that can do just that. All you need to do is start using the CamelCasePropertyNamesContractResolver and Bob is your uncle. Or is he?
Unfortunately things aren’t that simple. It turns out just using CamelCasePropertyNamesContractResolver will break the internal SignalR data contracts and that is not a good thing. But with a bit of help we can still get this to work.
The SignalRContractResolver that makes things work
The solution is the SignalRContractResolver found here.
public class SignalRContractResolver : IContractResolver
private readonly Assembly _assembly;
private readonly IContractResolver _camelCaseContractResolver;
private readonly IContractResolver _defaultContractSerializer;
_defaultContractSerializer = new DefaultContractResolver();
_camelCaseContractResolver = new CamelCasePropertyNamesContractResolver();
_assembly = typeof(Connection).Assembly;
public JsonContract ResolveContract(Type type)
With the SignalRContractResolver in place all we need to do is register it with SignalR. Below is the code I use to do that.
public static void RegisterHubs()
var serializerSettings = new JsonSerializerSettings
ContractResolver = new SignalRContractResolver()
var jsonNetSerializer = new JsonNetSerializer(serializerSettings);
GlobalHost.DependencyResolver.Register(typeof (IJsonSerializer), () => jsonNetSerializer);