Den*_*nis 0 .net c# asp.net enums signalr
我有一个自托管的SignalR服务器将数据传递给.NET SignalR客户端.从本质上讲,它正在对自定义类型进行连续或按需更新.当我想触发更新时,我创建了一个数据传输对象,加载了要发送的数据,并通过SignalR发送.客户端捕获更新并显示新值(我有一个WPF应用程序和一个控制台应用程序,两者基本上做同样的事情 - WPF应用程序只是做了一点"更漂亮").对于我的DTO上的大多数属性,一切正常.但是有两个属性是枚举值,并且无论我在服务器端设置什么,它们总是作为枚举的0值(在我的情况下为"未知")来到客户端.在服务器端,我一直跟踪它
Clients.All.updateData(data);
Run Code Online (Sandbox Code Playgroud)
调用和DTO(数据)具有正确的枚举值,一直到该点.但是在接收来自服务器的调用的函数点处在客户端放置断点,DTO对于两个枚举都具有不正确的(0)值.我已经在线搜索SignalR序列化枚举值的任何可能问题,我没有遇到过任何问题.有什么我想念的吗?提前致谢.
丹尼斯
spo*_*ahn 18
ASP.NET Core 3.x 或更高版本
using System.Text.Json.Serialization;
services.AddSignalR()
.AddJsonProtocol(options =>
{
options.PayloadSerializerOptions.Converters
.Add(new JsonStringEnumConverter());
});
Run Code Online (Sandbox Code Playgroud)
ASP.NET Core 2.2 或更低
using Newtonsoft.Json.Converters;
services.AddSignalR()
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.Converters
.Add(new StringEnumConverter());
});
Run Code Online (Sandbox Code Playgroud)
你说你在网上查了一切,但我仍然希望这个链接有用.
只需调整您的Startup类:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,经过多次摸索之后,我似乎需要将 setter 添加到 DTO 上的公共枚举属性中,以使它们正确序列化(或者,更准确地说,我认为,使它们反序列化)。最初我有不可变的属性(这对于我的原始类型的其他属性来说效果很好)。我尝试了很多事情 - 从更改属性名称(最初与枚举类型的名称相同),到更新客户端中的 Newtonsoft 包,再到添加 Json 转换器的东西。但看来最终成功的方法是将 setter 添加到我的枚举属性中。我仍然不知道为什么会这样,或者是否有其他方法可以解决我的问题(如果有人有任何想法,请告诉我!),但这解决了问题。感谢那些回复的人。
丹尼斯
| 归档时间: |
|
| 查看次数: |
1276 次 |
| 最近记录: |