2014-09-05 2 views
0

Услуги:Generic аргумент свойства вызывает ошибку на WebService

enter image description here Ошибка:

Ошибка с типом, который имеет ChainedListNode<T>. Дело в том, что, когда я удаляю DataMemberAttribute от Value, сервис работает.

[DataContract] 
public class ChainedListNode<T> 
{ 
    [DataMember] 
    public T Value { get; set; } 
} 

Любые идеи о том, что вызывает его и/или как его решить?

+0

http://jeffbarnes.net/blog/post/2007/05/10/WCF-Serialization-and-Generics.aspx может помочь? –

ответ

0

Проблема заключается в том, что параметр типа в открытом виде ChainedListNode<T> означает, что ChainedListNode<T>.Value может содержать что угодно вообще. WCF не может создать контракт, который описывает все возможные значения, которые могут быть помещены в свойство Value, поэтому он отвергает весь тип. Когда нет свойства Value, параметр типа T не имеет значения и игнорируется, и все работает нормально.

В подобных ситуациях я создал замкнутый тип, производный от моего общего типа и использовать этот тип в моем контракте данных:

[DataContract] 
public class ChainedListNodeOfString : ChainedListNode<string> 
{ 
    [DataMember] 
    public string Value { get; set; } 
} 

Если вам нужно, вы можете создать производный тип (и связанный с ним OperationContract) для каждого разного значения, которое нужно вернуть. Это делает ваш API более подробным, но он работает.

0

Я не думаю, что общий метод является хорошей идеей для использования в WCF, потому что я не вижу хорошей сериализации в этом случае, даже если вы можете добиться этого, хотя я не уверен, что это возможно, я бы подумайте, что вы все равно можете получить ошибку.

Причина, по которой он работает при удалении DataMember, заключается в том, что он не получает сериализованного теоретически, не используется в службе только на заднем конце.

Смежные вопросы