【发布时间】:2021-01-20 17:40:42
【问题描述】:
我正在开发一个 ASP.NET Core 3.1 SignalR 应用程序,但我遇到了第一个障碍。好的,这是第五关。
我的集线器如下所示:
public class ChatHub : Hub
{
public async Task SendMessage(object profile)
{
doSomethingWithProfile(profile);
}
}
效果很好,因为我使用的是object 类型。但是,我想使用强类型 DTO,如下所示:
public class ChatHub : Hub
{
public async Task SendMessage(ProfileDTO profile)
{
doSomethingWithProfile(profile);
}
}
但是,当我使用这种类型时,该方法永远不会被调用,即使我绝对确定 profile 对象与传递给它的数据的形状匹配:
public class ProfileDTO
{
public string given_name { get; set; }
public string family_name { get; set; }
public string nickname { get; set; }
public string name { get; set; }
public string picture { get; set; }
public string locale { get; set; }
public string updated_at { get; set; }
public string email { get; set; }
public string email_verified { get; set; }
public string sub { get; set; }
}
我确信这是一个非常简单的配置选项,但我不知道怎么做!有人可以帮忙吗?
更新
我可以像这样将它转换为 DTO:
public class ChatHub : Hub
{
public async Task SendMessage(object user)
{
ProfileDTO profileDto = ((JsonElement)user).ToObject<ProfileDTO>();
await Clients.All.SendAsync("ReceiveMessage", user);
}
}
public static class JsonElementExtensions
{
public static T ToObject<T>(this JsonElement element)
{
var json = element.GetRawText();
return JsonSerializer.Deserialize<T>(json);
}
public static T ToObject<T>(this JsonDocument document)
{
var json = document.RootElement.GetRawText();
return JsonSerializer.Deserialize<T>(json);
}
}
...但这似乎是一个非常多的跳跃。有没有更简单的方法?
【问题讨论】:
-
可能是序列化的原因...你试过这个吗?
services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerOptions.PropertyNamingPolicy = // your policy here });
标签: c# asp.net-core signalr auth0