2016-06-09 2 views
0

[Изменить]: Я добавил TokenType перечисление, то, что вызвало весь вопрос ...WCF объект в DataContract

У меня есть проблема с использованием 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 обратно клиенту, он всегда терпит неудачу. My qusetion: Есть ли возможность использовать объекты класса/структуры в объекте DataContract или мне нужно заменить объект AccessToken базовыми типами (например, строкой) в объекте AuthenticationResponse?

Спасибо всем, что вам нужно! С наилучшими пожеланиями

Габор

+0

Какое «провал»? – stuartd

+0

Передача данных от сервера к клиенту завершается с ошибкой до [DataMember] открытый токен доступаToken {get; задавать; } не является нулевым в классе аутентификацииResponse. Если он имеет значение null или изменен с помощью свойств типа строки, все работает хорошо. –

ответ

0

Ahh ... Извините за это. Я был действительно глупым ... Я забыл вставить перечисление TokenType в свой первоначальный вопрос, что является частью класса AuthenticationResponse, и в этом была проблема ... Я забыл, что установлены атрибуты [EnumMember] ...

После Я добавил, все сработало хорошо.

Извините за эту глупую и действительно начинающую проблему ...

Спасибо всех ваши помогает !!!

1

Проблема заключается ваш 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 
+0

Спасибо большое! Это был единственный вопрос с моей целью. :-) –

+1

Не забудьте отметить это как ответ, чтобы закрыть свой вопрос. – Panda