Я хотел бы знать, есть ли способ настроить SignalR так, чтобы клиент работал в объектах возврата центра с использованием верблюжьего корпуса.SignalR: use camel case
Спасибо.
Я хотел бы знать, есть ли способ настроить SignalR так, чтобы клиент работал в объектах возврата центра с использованием верблюжьего корпуса.SignalR: use camel case
Спасибо.
Ролл свой собственный 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/
Anders ответ правильный; Я просто хотел бы добавить, что для любого использования AutoFac вместо Ninject вы должны использовать эту регистрацию в вашем startup.cs
:
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();
Для использования с ASP .NET Ядра, вы можете зарегистрировать JsonSerializer, как это в Startup -> ConfigureServices:
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; }
это больше хлопот, каждый раз, когда вы собираетесь изменить модель, вам придется изменить эти жестко закодированные строки – dafriskymonkey
Он работает как шарм. – dafriskymonkey
Знаете ли вы, как сделать ту же конфигурацию в ASP.NET 5/SignalR 3? GlobalHost теперь заменен новым стилем инъекции зависимостей ... – Mikhail
Простите, что havent посмотрел на SignalR 3, у вас будет todo, что – Anders