c# - 通过 SignalR 发送不同对象的列表

标签 c# .net-core signalr-hub asp.net-core-signalr

通过 SignalR 向客户端发送不同对象列表的最佳方式是什么?

当我使用具有相同基类的对象列表时,客户端只接收基类的属性:

class Update { }
class UpdateA { public string PropertyA {get; set;}}
class UpdateB { public string PropertyB {get; set;}}
...
IEnumerable<Update> updates = GetUpdates();
await Clients.Caller.SendAsync("update", updates);

当我使用字符串形式的预序列化数据时,serialzier 将 json 数据转义为字符串。

IEnumerable<string> updates = GetUpdates();
await Clients.Caller.SendAsync("update", updates);
// data looks like: [ "{...}", "{...}" ]

我是否必须编写自己的 serialzier?它如何用于 dotnet 核心中的 SignalR?

最佳答案

我知道这是一个老问题,但这里有一个不需要编写您自己的 CustomConverter 而是依赖于 NewtonSoft 解决方案的其他解决方案:

  1. 首先你需要安装这个包:Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson

  2. 在服务器端,您需要在 Startup.cs 类中添加以下调用:

    services.AddSignalR()
        .AddNewtonsoftJsonProtocol(opts => 
            opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
    
  3. 如果你的客户端是C#客户端,你必须在建立连接时添加相同的配置:

    new HubConnectionBuilder()
        .WithUrl("/yourhub")
        .AddNewtonsoftJsonProtocol(opts => 
            opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto)
        .Build();
    

如果您的客户端不是 C# 客户端,我想您将不得不自己管理反序列化。 NewtonSoft.Json 只是将 $type 属性添加到生成的包含完全限定类型名称的 JSON(例如:Your.Namespace.ClassName)因此您可以使用它来选择要反序列化的相应类型。

来源:MSDN

关于c# - 通过 SignalR 发送不同对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60151229/

相关文章:

c# - 解决方案之间的记录错误

c# - 如何在 .net 核心中使用 Swagger Codegen

c# - SignalR 向特定用户发送消息

c# - 如何使用 lambda 表达式将属性列表传递给方法

c# - 从 .NET 应用程序中读取和解码存储在图像或 PDF 文件中的 PDF-417 条码

c# - 从.net core 2.1中的单例服务注入(inject)作用域服务

asp.net-web-api - 从 ASP.NET Web API 2 中的 header 和/或查询字符串中检索不记名 token

signalr - 如何限制SignalR服务器连接?

c# - 返回 List<object> 时 Asp.net Webservice 不工作

c# - 无法确定导航属性 EF Core 表示的关系