SignalR .NET核心camelCase JSON合同解析器

使用.NET Core RC2。 有SignalR工作,但试图让它返回JSON中的camelCase属性。

对于我正在使用的API …

services.AddMvc().AddJsonOptions(o => { o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); 

也许SignalR还没有任何东西(毕竟,它甚至不应该工作……),但是想知道是否有人想出来了吗? 我尝试了一些像……

 services.AddTransient(); 

……但没有去。

有人这个工作了吗?

基于SignalR Core存储库中的此问题 ,目前没有本地方法可以执行此操作,但您可以创建自定义合约解析程序, 如此评论中针对旧SignalR问题所示 。

由于该线程适用于SignalR 2.2.0,因此让它适用于SignalR Core。

 using System; using System.Reflection; using Microsoft.AspNetCore.SignalR.Infrastructure; using Newtonsoft.Json.Serialization; 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).GetTypeInfo().Assembly; } public JsonContract ResolveContract(Type type) { if (type.GetTypeInfo().Assembly.Equals(_assembly)) return _defaultContractSerializer.ResolveContract(type); return _camelCaseContractResolver.ResolveContract(type); } } 

这里发生的是你不能使用camel案例合同解析器用于SignalR内部,因为它会破坏与客户端的通信。

因此,每当我们在ResolveContract方法中解析合同时,我们必须检查当前已解决的类型的程序集,并检查它是否为SignalR internal。 如果没有,那么我们可以使用驼峰案解决合同。

此时,我们需要在框架中注册此合同解析程序。

 public void ConfigureServices(IServiceCollection services) { var settings = new JsonSerializerSettings(); settings.ContractResolver = new SignalRContractResolver(); var serializer = JsonSerializer.Create(settings); services.Add(new ServiceDescriptor(typeof(JsonSerializer), provider => serializer, ServiceLifetime.Transient)); // register other services like SignalR, MVC and custom services } 

祝你好运!

让我在GitHub上引用anurse的答案:

由于协议是可插拔的,因此选项被移动到不同的位置,因为您可能根本不选择使用JSON。 现在,您在ConfigureServices中的.AddJsonProtocol扩展方法中设置它们,如下所示:

 services.AddSignalR() .AddJsonProtocol(options => { // Edit or replace 'options.PayloadSerializerSettings' here! }); 

截至signalR core(1.0.0-alpha1-final)的第一个最终alpha版本,您可以像下面的代码片段一样获取驼峰案例:

 services.AddSignalR(option => { option.JsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); 

实际上,您也可以使用任何自定义解析器而不是CamelCasePropertyNamesContractResolver