Объект WCF в DataContract
[Редактировать]: я добавил перечисление TokenType, что вызвало всю проблему...
У меня проблема с использованием WCF, и, к сожалению, я не нашел никакой полезной помощи. Я создаю приложение на основе WCF. Когда сервер отвечает на запрос клиента, я хочу отправить обратно следующий класс:
[DataContract]
public enum TokenType
{
User,
Device
}
[DataContract]
public class AuthenticationResponse
{
[DataMember]
public LogonStatus Status { get; set; }
[DataMember]
public AccessToken Token { get; set; }
}
[DataContract]
public struct AccessToken
{
[DataMember]
public string TokenID
{
get;
set;
}
[DataMember]
public TokenType Type
{
get;
set;
}
[DataMember]
public string Uid
{
get;
set;
}
[DataMember]
public string Name
{
get;
set;
}
[DataMember]
public DateTime ExpirationTime
{
get;
set;
}
[DataMember]
public DateTime GenerationTime
{
get;
set;
}
[DataMember]
public bool IsExpired
{
get
{
return DateTime.Now > this.ExpirationTime;
}
}
}
Когда я отправляю AuthenticationResponse обратно клиенту, он всегда терпит неудачу. Мой вопрос: есть ли шанс использовать объекты класса / структуры в объекте DataContract, или мне нужно заменить объект AccessToken базовыми типами (например, строка) в объекте AuthenticationResponse?
Спасибо всем за помощь! С наилучшими пожеланиями
Gabor
2 ответа
Ааа... Извините за это. Я был действительно глупым... Я забыл вставить перечисление TokenType в свой первоначальный вопрос, что является частью класса AuthenticationResponse, и это было проблемой... Я забыл установить атрибуты [EnumMember]...
После того, как я добавил, все работало хорошо.
Извините за эту глупую и действительно начинающую проблему...
Спасибо всем, кто помогает!
Проблема ваша public bool IsExpired
не имеет установщика и поэтому вызывает проблемы при сериализации объекта.
Обходной путь должен установить защищенный / частный установщик для вашего свойства с пустым телом (или заменить его методом)
[DataMember]
public bool IsExpired
{
get
{
return DateTime.Now > this.ExpirationTime;
}
set
{
/* Dummy setter for serialization fix */
}
}
Вы можете найти больше информации о Сериализации здесь: https://msdn.microsoft.com/en-us/library/182eeyhh.aspx
Более конкретно:
Предметы, которые можно сериализовать
Следующие элементы могут быть сериализованы с использованием класса XmLSerializer:
Public read/write properties and fields of public classes