SignalR: utiliser camel case

je voudrais savoir s'il y a un moyen de configurer SignalR de manière à ce que le client fonctionne dans les objets de retour hub en utilisant le cas de camel.

Merci.

25
demandé sur dafriskymonkey 2015-05-02 20:53:38
la source

4 ответов

lancez votre propre résolveur de contrat 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);
    }

}

Inscrire

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

si vous utilisez un coi personnalisé, vous pouvez rencontrer des problèmes parce que JsonSerializer est un type de béton et quelques IoCs comme par exemple Ninject injectera des types de béton non lié. Dans le cas de Ninjects, la solution est de l'enregistrer avec Ninject au lieu de L'enregistrer avec SignalRs own DependencyResolver

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

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

48
répondu Anders 2015-07-08 23:31:27
la source

Anders réponse est correcte; je voulais juste ajouter que pour n'importe qui utilisant AutoFac au lieu de Ninject vous devriez utiliser cette inscription dans votre startup.cs:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();
4
répondu John Reilly 2016-08-06 14:39:24
la source

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);
1
répondu Francis 2016-09-27 19:24:12
la source

si vous ne voulez pas vous mêler de la configuration de SignalR ou si vous l'avez trouvée trop compliquée, vous pouvez ajouter l'attribut JsonProperty pour spécifier le nom de la propriété après la sérialisation sur votre modèle. JsonProperty est 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
répondu Adamy 2018-02-21 00:45:20
la source