Подтвердить что ты не робот

SignalR: использовать верблюд

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

Спасибо.

4b9b3361

Ответ 1

Сверните свой собственный Conttract resolver, как

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 будут вводить несвязанные конкретные типы. В случае Ninjects решение заключается в регистрации его с помощью Ninject, а не с SignalRs own 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/

Ответ 2

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

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

Ответ 3

Для использования с ASP.NET Core вы можете зарегистрировать JsonSerializer следующим образом: Startup → ConfigureServices:

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