2015-05-02 3 views
24

Я хотел бы знать, есть ли способ настроить SignalR так, чтобы клиент работал в объектах возврата центра с использованием верблюжьего корпуса.SignalR: use camel case

Спасибо.

ответ

44

Ролл свой собственный 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); 
    } 

} 

Зарегистрируйте как

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

Если вы используете пользовательские IoC вы можете столкнуться с проблемами, поскольку JsonSerializer является конкретный тип и некоторые МНК, как, например, Ninject будет вводить несвязанные конкретные типы. В случае Ninjects решения зарегистрировать его 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/

+0

Он работает как шарм. – dafriskymonkey

+1

Знаете ли вы, как сделать ту же конфигурацию в ASP.NET 5/SignalR 3? GlobalHost теперь заменен новым стилем инъекции зависимостей ... – Mikhail

+0

Простите, что havent посмотрел на SignalR 3, у вас будет todo, что – Anders

4

Anders ответ правильный; Я просто хотел бы добавить, что для любого использования AutoFac вместо Ninject вы должны использовать эту регистрацию в вашем startup.cs:

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

Для использования с ASP .NET Ядра, вы можете зарегистрировать JsonSerializer, как это в Startup -> ConfigureServices:

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

Если вы не хотите, чтобы вмешиваясь SignalR конфигурации или нашел его слишком много неприятностей, вы можете добавить JsonProperty атрибут, чтобы указать имя свойства после сериализации на вашей модели. JsonProperty - это JSON.NET, который SignalR использует для сериализации.

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

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

это больше хлопот, каждый раз, когда вы собираетесь изменить модель, вам придется изменить эти жестко закодированные строки – dafriskymonkey