Предоставление ApplicationUser в WebAPI

Я хотел бы иметь возможность отображать список пользователей, использующих WebAPI 2. Однако, поскольку я использую новую структуру аутентификации Asp.Net в MVC5, я не могу найти способ пометить только определенные поля как DataMembers.

Вот что у меня есть:

[DataContract]    
public class ApplicationUser : IdentityUser {
    public Nullable<DateTime> birthday { get; set; }
    [DataMember]
    public int tolerance { get; set; }
    [DataMember]
    public string twitter { get; set; }
}

Однако, похоже, это не работает, потому что IdentityUser не имеет атрибута [DataContract]. Я пытался создать собственный IdentityUser, но мне не удалось выполнить сборку после создания пользовательской копии IdentityUser.

Любые советы или обходные пути здесь? Я бы предпочел не создавать ViewModel, если только это не является лучшей практикой.


person JustMaier    schedule 22.10.2013    source источник
comment
Оказывается, использование ViewModel определенно является лучшей практикой, когда речь идет о WebAPI. Если вы действительно хотите избежать ViewModel, сделайте то, что @Illuminati сказал в своем ответе.   -  person JustMaier    schedule 06.02.2017


Ответы (3)


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

public class ApplicationUser : IdentityUser
    {
        public UserType UserType { get; set; }

        [JsonIgnore]
        public override string PasswordHash
        {
            get { return base.PasswordHash; }
            set { base.PasswordHash = value; }
        }
    }
person Illuminati    schedule 06.02.2017
comment
Спасибо @Illuminati, это был бы ответ, который я искал. Тем не менее, это не лучшая практика, и отправка всей модели в WebAPI, вероятно, не лучшая идея. - person JustMaier; 06.02.2017
comment
Я согласен, что это не лучший. Но когда вы делаете небольшой POC и хотите передать вещи в объекте ApplicationUser - вы действительно не хотите добавлять сложность AutoMapper или создавать ViewModels - person Illuminati; 07.02.2017

Вероятно, вам следует просто отправить другой объект с необходимой вам информацией о пользователе, а не сериализовать пользовательский объект.

person Hao Kung    schedule 22.10.2013

Какой форматтер вы хотите использовать? Я не вижу никаких проблем с форматированием Json по умолчанию. Но для сериализатора xml требуется, чтобы базовый класс также был DataContract.

Модель просмотра всегда является лучшей практикой, хотя в большинстве примеров для веб-API для простоты используется объект данных. Эти две модели не связаны друг с другом. Модель представления представляет собой контракт вашего API, а модель данных представляет концепцию вашей предметной области. Объединение двух моделей в одну может повлиять на ваше дизайнерское решение или, что еще более серьезно, может вызвать проблемы с безопасностью. Использование объекта данных может предоставить пользователю неожиданные данные. Например, разные средства форматирования имеют разные правила управления экспозицией модели. JsonIgnore не работает в форматировщике xml. Это будет сложнее, если у вас есть собственный форматтер. Особенно для объекта удостоверения пользователя, который имеет много конфиденциальных свойств, таких как хэш пароля, штамп безопасности. Я не рекомендую вам выставлять это на всеобщее обозрение.

Кстати, существует множество инструментов сопоставления, которые могут помочь упростить сопоставление модели предметной области с моделью представления. Они могут вам понадобиться: http://www.nuget.org/packages?q=mapper

person Hongye Sun    schedule 22.10.2013
comment
Я буду использовать JSON, но мне нужно было игнорировать свойства JSON в IdentityUser, но я не могу изменить или реплицировать его... Теперь, когда я знаю, что лучше всего создать модель представления, я создам модель представления и используйте AutoMapper для сопоставления с моделью представления, используя информацию из этот вопрос. - person JustMaier; 23.10.2013