использование WCF с устаревшими сложными типами - PullRequest
1 голос
/ 19 февраля 2009

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

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

Всякий раз, когда мой клиент вызывает службу WCF, он получает исключение связи, и когда я включил трассировку для WCF, я обнаружил ошибку сериализации:

Тип 'Common.Permission.ApplicationGroup' с именем контракта данных ' ApplicationGroup : http://schemas.datacontract.org/2004/07/Common.Permission' не ожидается. Добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, передаваемых DataContractSerializer.

Тип, который я хочу вернуть, - ApplicationPrincipal, но, похоже, он переходит на дочерний тип. Вот как выглядят эти классы:

Тип, который я хочу вернуть:

[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class ApplicationPrincipal : 
    IPrincipal, ISupportInitialize, IDeserializationCallback, IFormattable
{
    private ApplicationIdentity m_identity;
    private ApplicationGroupCollection m_groups;
    private ConditionDictionary m_roleConditions;

и вот ApplicationGroupCollection:

[Serializable]
public class ApplicationGroupCollection : 
    IList, IEnumerable, IFormattable, ISupportInitialize, 
    IDeserializationCallback, ICloneable, ICustomTypeDescriptor
{
    /// <summary>
    /// Occurs when a value is being changed in the collection.
    /// </summary>
    [field:NonSerialized]
    public event CollectionChangeEventHandler CollectionChanging;

    /// <summary>
    /// Occurs when a value has been changed in the collection.
    /// </summary>
    [field:NonSerialized]
    public event CollectionChangeEventHandler CollectionChanged;

и, наконец, ApplicationGroup:

[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class ApplicationGroup : 
    ICloneable, ISupportInitialize, IDeserializationCallback, IFormattable
{
    private int m_groupID;
    private string m_groupName;
    private string m_groupDesc;
    private ConditionDictionary m_roleConditions;

Какие-либо предложения относительно того, почему WCF не может сериализовать ApplicationGroup?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2009

Попробуйте добавить их в начало вашего DataContract:

[KnownType(typeof(ApplicationGroupCollection))]
[KnownType(typeof(ApplicationGroup))]

[Редактировать] Без тестирования я не могу сказать вам, будет ли это работать - мне интересно, сможет ли DataContractSerializer сериализовать ваши унаследованные типы, поскольку DataContractSerializer требует, чтобы типы «подписались» с атрибутами на тип все члены, которые нуждаются в сериализации.

[Edit] Вот причина второго набора ошибок, которые вы видите. Если вы возвращаете пользовательский тип из службы, то клиент должен иметь копию этого типа, чтобы он мог десериализовать сообщение. Это означает, что вам нужно будет предоставить клиенту копию сборок, которые содержат устаревшие типы, для ссылки на него.

1 голос
/ 19 февраля 2009

Я думаю, что Эндрю прав.

Также см. Главу 3 " Программирование служб WCF " Джувала Лоуи. Он содержит обширную информацию о DataContracts, и я уверен, что он охватывает именно то, что вы спрашиваете здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...