Могу ли я сделать не примитивные типы .NET сериализуемыми в WCF? - PullRequest
0 голосов
/ 15 мая 2018

Когда я пытаюсь получить доступ к сервису myWCF из веб-браузера в интрасети моей компании по URL-адресу ~ / MyNamespace.MyServiceClass.svc, я получаю следующее сообщение:

Тип «System.DirectoryServices.AccountManagement.PrincipalContext» не можетбыть сериализованным.Попробуйте пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute.Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute.См. Документацию Microsoft .NET Framework для других поддерживаемых типов.

MyClass реализует все заглушки [OperationContract] в моем интерфейсе, и я добавил декоратор [DataContract ()] выше, где MyClass: MyInterface, но когда я пытаюсь иУкрасив элемент PricipalContext в моем классе с помощью [DataMember], Visual Studio сообщает через intellisense, что атрибут DataMember недопустим для этого типа объявления, он действителен только для объявлений свойств, индексаторов и полей.

    public PrincipalContext GetPrincipalContext()
    {
        PrincipalContext principalContext = new PrincipalContext(
            ContextType.Domain, GetUserDomainName()
        );
        return principalContext;
    }

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.datacontractattribute?view=netframework-4.7.2

Я не уверен в некоторых вещах из документов MSDN (как выше), которые говорят, что точка атрибута DataContract: "Указывает, что тип определяет илиреализует контракт данных и сериализуется сериализатором, таким как DataContractSerializer. Чтобы сделать их тип сериализуемым, авторы типов должны определить контракт данных для своего типа. "

1.) Как я должен сделать сериализуемый ранее существующим непримативным типом класса из .NET Framework, когда я не являюсь автором указанного типа класса (System.DirectoryServices.AccountManagement.PrincipalContext)

2.) Все примеры, которые я обнаружил на MSDN, касаются этой проблемы, но содержат только примеры, реализующие пользовательские типы пользовательских классов, такие как Person ().

3.) Имеет ли System.DirectoryServices.AccountManagement.PrincipalContext должен быть сериализуемым, чтобы класс MyWCFService содержал указанный тип в качестве члена?Основной причиной создания MyWCFService является предоставление функциональности из библиотек System.DirectoryServices и System.DirectoryServices.AccountManagement в моей организации.

1 Ответ

0 голосов
/ 18 мая 2018

Это по замыслу.Эти типы не сериализуемы.Вы можете обойти эту проблему, создав класс-оболочку.Вы можете сделать что-то вроде:

    [DataContract]
    public class MyClass
    {
        public PrincipalContext PrincipalContext { get; set; }

        [DataMember(Name="PrincipalContext")]
        public PrincipalContextSurrogate PrincipalContextWrapper
        {
            get
            {
                return new PrincipalContextSurrogate(PrincipalContext);
            }
            set
            {
                PrincipalContext = value.ToPrincipalContext();
            }
        }
    }

    [DataContract]
    public class PrincipalContextSurrogate
    {
        public PrincipalContextSurrogate() { }

        public PrincipalContextSurrogate(PrincipalContext context)
        {
            ContextType = context.ContextType;
            Name = context.Name;
        }

        [DataMember]
        public ContextType ContextType { set; get; }

        [DataMember]
        public string Name { set;  get; }

        public PrincipalContext ToPrincipalContext()
        {
            return new PrincipalContext(ContextType, Name);
        }
    }
...