【发布时间】:2015-07-12 09:20:40
【问题描述】:
我想知道是否有办法配置 SignalR,以便集线器中的客户端函数使用驼峰式大小写返回对象。
谢谢。
【问题讨论】:
标签: serialization json.net signalr deserialization
我想知道是否有办法配置 SignalR,以便集线器中的客户端函数使用驼峰式大小写返回对象。
谢谢。
【问题讨论】:
标签: serialization json.net signalr deserialization
滚动你自己的合约解析器
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 而不是 SignalR 自己的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/
【讨论】:
安德斯的答案是正确的;我只是想补充一点,对于使用 AutoFac 而不是 Ninject 的任何人,您应该在 startup.cs 中使用此注册:
var settings = new JsonSerializerSettings();
settings.ContractResolver = new SignalRContractResolver();
var serializer = JsonSerializer.Create(settings);
builder.RegisterInstance(serializer).As<JsonSerializer>();
【讨论】:
要与 ASP .NET Core 一起使用,您可以像这样在 Startup -> ConfigureServices 中注册 JsonSerializer:
var settings = new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() };
var serializer = JsonSerializer.Create(settings);
services.AddSingleton(serializer);
【讨论】:
为 asp.net 核心配置 signalR 序列化设置的正确方法是:
// Inside your Startup.ConfigureServices
var settings = new JsonSerializerSettings
{
// ... your serialization settings
};
services.AddOptions<JsonHubProtocolOptions>()
.Configure(x => x.PayloadSerializerSettings = settings);
【讨论】:
如果您不想干预 SignalR 配置或发现它太麻烦,您可以添加 JsonProperty 属性来指定模型序列化后的属性名称。 JsonProperty 来自 JSON.NET,SignalR 使用它进行序列化。
[JsonProperty("id")]
public byte Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
【讨论】: