Csharp/C#教程:SignalR .NET核心camelCase JSON合同解析器分享


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

上述就是C#学习教程:SignalR .NET核心camelCase JSON合同解析器分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1023025.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

精彩推荐