web-dev-qa-db-fra.com

SignalR: utiliser un étui camel

J'aimerais savoir s'il existe un moyen de configurer SignalR pour que les fonctions client dans le hub renvoient des objets à l'aide de la fonction chameau.

Merci.

26
dafriskymonkey

Lancez votre propre résolveur Conttract comme

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

}

Enregistrez-le comme

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

Si vous utilisez un IoC personnalisé, vous pouvez rencontrer des problèmes car JsonSerializer est un type concret et que certains IoC, comme par exemple Ninject, injecteront des types concrets non liés. Dans le cas de Ninjects, la solution consiste à l’enregistrer avec Ninject au lieu de SignalRs own DependencyResolver

var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
kernel.Bind<JsonSerializer>().ToConstant(serializer);

Plus d'infos sur mon blog: http://andersmalmgren.com/2014/02/27/why-overriding-jsonserializer-no-longer-work-in-signalr-2-0/

50
Anders

Anders répond que c'est correct. Je voulais juste ajouter que pour toute personne utilisant AutoFac au lieu de Ninject, vous devriez utiliser cet enregistrement dans votre startup.cs:

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

Pour une utilisation avec ASP .NET Core, vous pouvez enregistrer le JsonSerializer comme ceci dans Startup -> ConfigureServices:

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

Si vous ne voulez pas vous mêler de SignalR config ou si vous le trouvez trop compliqué, vous pouvez ajouter l'attribut JsonProperty pour spécifier le nom de la propriété après la sérialisation du modèle. JsonProperty provient de JSON.NET, que SignalR utilise pour la sérialisation. 

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

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

La manière appropriée de configurer les paramètres de sérialisation de signalR pour asp.net core est la suivante:

// Inside your Startup.ConfigureServices

var settings = new JsonSerializerSettings
{
    // ... your serialization settings 
};

services.AddOptions<JsonHubProtocolOptions>()
        .Configure(x => x.PayloadSerializerSettings = settings);
0
lorond