【问题标题】:ASP.NET Core 3.1 SignalR: DTOs cause hub method failureASP.NET Core 3.1 SignalR:DTO 导致集线器方法失败
【发布时间】: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 =&gt; { options.PayloadSerializerOptions.PropertyNamingPolicy = // your policy here });

标签: c# asp.net-core signalr auth0


【解决方案1】:

我认为属性名称是 ProfileDTO 中的问题。属性名称以小写开头,这会导致绑定问题。

【讨论】:

  • 有没有办法配置 SignalR 以允许这些属性保持小写?在我的应用程序中,将它们大写对我来说毫无意义。
猜你喜欢
  • 1970-01-01
  • 2018-12-22
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2021-06-19
  • 2020-08-29
  • 2021-09-19
相关资源
最近更新 更多