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.
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/
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>();
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);
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; }
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);