Игнорировать атрибут объекта при использовании SignalR

#c# #asp.net-core #signalr

#c# #asp.net-core #signalr

Вопрос:

у меня проблема с игнорированием атрибута, поэтому он не отправляется клиенту. У меня есть этот объект

 public class UserEntry : IComparable<UserEntry>
{
    [JsonIgnore]
    public string UserId { get; set; }

    public string AnonymousUserId { get; set; }
}
  

И у меня возникает проблема, когда, например, я отправляю сообщение в свое приложение SignalR, которое UserId все еще находится в данных, но я хочу, чтобы AnonymousUserId оно было отправлено только потому, что UserId используется только в серверной части и никогда не должно быть в клиенте.

итак, когда я доберусь сюда

     public Task TopUserBroadcast(TopUsersBroadcastNotificationModel model)
    {
        SignalRClient.SendAsync(SignalRAppMethods.Broadcast, Constants.GetInfoGroup(model.InfoId), ResponseMessageIDs.TopUsers,model.Entries);
        return Task.CompletedTask;
    }
  

userId Все еще находится в model.Entries . В любом случае, я могу заставить его игнорировать этот атрибут?

и TopUsersBroadcastNotificationModel выглядит так

 public class TopUsersBroadcastNotificationModel
{
    public List<UserEntry> Entries { get; set; }

    public long InfoId { get; set; }

    public TopUsersBroadcastNotificationModel(List<UserEntry> entries, long InfoId)
    {
        Entries = entries;
        InfoId = infoId;
    }
}
  

Итак, чего я действительно хочу и надеялся, что [JsonIgnore] решит, так это то, что при отправке клиенту идентификатор пользователя следует игнорировать, поэтому, если я регистрирую записи, которые я получаю на клиенте, там не должно быть идентификатора пользователя.

Ответ №1:

вам нужно добавить в свою сущность функцию следующим образом :

 public bool ShouldSerializeXXXX() { return false; }
  

измените XXXX на свое имя атрибута.

в вашем случае UserId :

 public bool ShouldSerializeUserId() { return false; }
  

Если вам нужно сделать его динамическим, вы можете ввести статическое логическое значение в поле возврата и изменить его, когда вам нужно

Редактировать

что касается вашего комментария, это то, что работает в моем случае: у меня есть класс person с fingerprint в виде строкового поля, и я не хотел отправлять его через SignalR hub или даже веб-сервисы, но с помощью определенного действия для получения fingerprint , так что рассматривайте объект person с атрибутами fingerprint следующим образом

 public string fingerprint { get; set; }
  

я добавил этот метод :

 public bool ShouldSerializefingerprint() { return ShouldSerializefingerprintTest; }
  

ShouldSerializefingerprintTest поле представляет собой статические логические атрибуты, которые могут быть изменены на true или false
по умолчанию значение false, поэтому отпечаток пальца не будет отображаться ни в одном веб-сервисе / SignalR

и когда мне нужно получить отпечаток, ShouldSerializefingerprintTest чтобы true , но public bool ShouldSerializefingerprint() { return false; } я могу сделать то, что вам нужно.

вы можете найти больше в документе Microsoft.

Комментарии:

1. Как бы это удалило / проигнорировало атрибут перед его отправкой? у вас есть пример того, где это вызвать и как это работает?