SignalR 未序列化自定义类型的枚举值

SignalR not serializing enum values on custom type

我有一个自托管的 SignalR 服务器将数据传递给 .NET SignalR 客户端。本质上,它正在对自定义类型进行连续或按需更新。当我想触发更新时,我创建了一个数据传输对象,用要发送的数据加载它,并通过 SignalR 发送它。客户端捕获更新并显示新值(我有一个 WPF 应用程序和一个控制台应用程序,两者基本上做同样的事情 - WPF 应用程序只是做了一点 "prettier")。对于我的 DTO 上的大多数属性,一切都正常。但是有两个属性是枚举值,无论我在服务器端将其设置为什么,它们总是作为枚举的 0 值(在我的例子中为 "Unknown")传递给客户端。在服务器端,我一直追踪到

Clients.All.updateData(data);

调用和 DTO(数据)一直到那个点都有正确的枚举值。但是在客户端的断点就在从服务器接收调用的函数点,DTO 的两个枚举值都不正确 (0)。我在网上搜索了 SignalR 序列化枚举值的任何可能问题,但我没有遇到任何问题。有什么我想念的吗?提前致谢。

丹尼斯

你说你在网上查了所有的东西,但我还是希望这个link能有用。

只需调整您的启动 class:

public class Startup
{
public void Configuration(IAppBuilder app)
{
    // Create JsonSerializer with StringEnumConverter.
    var serializer = new JsonSerializer();
    serializer.Converters.Add(new StringEnumConverter());
    // Register the serializer.
    GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);

    app.MapSignalR();
    }
}

好吧,经过多次摸索之后,我似乎需要将 setter 添加到我的 DTO 上的 public 枚举属性中,以使它们序列化(或者,更准确地说,我相信,使它们反序列化)正确。最初我有不可变的属性(这对我的原始类型的其他属性很好用)。我尝试了很多事情——从更改 属性 名称(最初与枚举类型的名称相同)到更新客户端中的 Newtonsoft 包,再到添加 Json 转换器。但似乎最终成功的方法是将 setter 添加到我的枚举属性中。我仍然不知道为什么会这样,或者是否有其他方法可以解决我的问题(如果有人有任何想法,请告诉我!),但这解决了问题。感谢回复的人。

丹尼斯

ASP.NET 核心 3.x 或更高

using System.Text.Json.Serialization;

services.AddSignalR()
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerOptions.Converters
           .Add(new JsonStringEnumConverter());
    });

ASP.NET Core 2.2 或更低版本

using Newtonsoft.Json.Converters;

services.AddSignalR()
    .AddJsonProtocol(options =>
    {
        options.PayloadSerializerSettings.Converters
            .Add(new StringEnumConverter());
    });

补充阅读:ASP.NET Core SignalR configuration