websocket 如何通过ASP.NET Core上的SignalR发送具有泛型集合的对象

fnatzsnv  于 2022-11-11  发布在  .NET
关注(0)|答案(1)|浏览(178)

在我的ASP.NET核心Web应用程序上,我使用SignalR为我的Angular 应用程序提供一些实时更新。

public class DataBatch
{
    public Guid DashboardId { get;set; }
    public IEnumerable<WidgetData> WidgetData { get;set; }
    public DateTime RefreshDate { get;set; }
}
public abstract class WidgetData
{
    public Guid WidgetUsageId { get; set;}
    public DateTime Timestamp { get; set;}
}

问题是WidgetData是抽象的,它的大多数实现都有附加值。通常:

public class ValueIndicatorData : WidgetData
{
    public IList<ValueIndicatorValue> ValueIndicatorValues { get; } = new List<ValueIndicatorValue>();
}

当我将数据发送给客户时:

await _hubContext.Clients.Group(dashboardId).SendDashboardData(notification.DataBatch);

我的客户端只接收在WidgetData中声明的属性,而不是我的子类之一(如ValueIndicatorData)。
我如何向SignalR提供该对象具有子类以及其属性应被序列化的信息?

628mspwn

628mspwn1#

我结束了将Asp.NetCore配置为使用NewtonSoft序列化为JSON的过程,同时设置了一个包含类型的选项,现在它会自动序列化数据:

builder.Services.AddSignalR()
        .AddNewtonsoftJsonProtocol(opts =>
        {
            opts.PayloadSerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
        });

有一种使用原生JSON转换器的替代方法,但它需要构建一些繁琐的转换器:
https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to?pivots=dotnet-6-0#support-polymorphic-deserialization

相关问题