SignalR :使用驼峰大小写
SignalR : use camel case
我想知道是否有配置 SignalR 的方法,以便客户端在集线器 return 对象中使用驼峰式大小写功能。
谢谢。
像
一样滚动你自己的合同解析器
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 将注入未绑定的具体类型。在 Ninject 的情况下,解决方案是使用 Ninject 注册它,而不是使用 SignalRs 自己的 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);
如果您不想干预 SignalR 配置或发现它太麻烦,您可以添加 JsonProperty 属性以在模型上序列化后指定 属性 名称。 JsonProperty 来自 JSON.NET,SignalR 使用它进行序列化。
[JsonProperty("id")]
public byte Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
为 asp.net 内核配置 signalR 序列化设置的正确方法是:
// Inside your Startup.ConfigureServices
var settings = new JsonSerializerSettings
{
// ... your serialization settings
};
services.AddOptions<JsonHubProtocolOptions>()
.Configure(x => x.PayloadSerializerSettings = settings);
我想知道是否有配置 SignalR 的方法,以便客户端在集线器 return 对象中使用驼峰式大小写功能。
谢谢。
像
一样滚动你自己的合同解析器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 将注入未绑定的具体类型。在 Ninject 的情况下,解决方案是使用 Ninject 注册它,而不是使用 SignalRs 自己的 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:
中注册 JsonSerializervar settings = new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() };
var serializer = JsonSerializer.Create(settings);
services.AddSingleton(serializer);
如果您不想干预 SignalR 配置或发现它太麻烦,您可以添加 JsonProperty 属性以在模型上序列化后指定 属性 名称。 JsonProperty 来自 JSON.NET,SignalR 使用它进行序列化。
[JsonProperty("id")]
public byte Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
为 asp.net 内核配置 signalR 序列化设置的正确方法是:
// Inside your Startup.ConfigureServices
var settings = new JsonSerializerSettings
{
// ... your serialization settings
};
services.AddOptions<JsonHubProtocolOptions>()
.Configure(x => x.PayloadSerializerSettings = settings);