CommunicationException: ошибка при попытке сериализации параметра - PullRequest
3 голосов
/ 29 июля 2011

У меня есть веб-сервис с методом, который принимает параметр абстрактного базового типа Specification<TDomainModel> в качестве параметра.Я понимаю, что WCF не знает, как де-сериализовать это без указания известных типов.Но когда я пытаюсь указать их, я все еще получаю следующее исключение:

Произошла ошибка при попытке сериализации параметра http://myproject.org:specification. Сообщение InnerException было «Тип» MyProject.DomainModel.WebSnapshot.WebSnapshotSpecification 'с именем контракта данных' WebSnapshotSpecification: http://schemas.datacontract.org/2004/07/MyProject.DomainModel.WebSnapshot' не ожидается.Добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, передаваемых в DataContractSerializer.

Если кто-то может увидеть, где ячто-то пропустил, было бы очень признательно :) Классы выглядят следующим образом:

WebSnapshotRepositoryService:

[ServiceContract(Namespace = "http://myproject.org")]
[ServiceKnownType(typeof(Specification<WebSnapshot>))]
[ServiceKnownType(typeof(WebSnapshotSpecification))]
public class WebSnapshotRepositoryService
{
    [OperationContract]
    public IEnumerable<WebSnapshot> Get(Specification<WebSnapshot> specification)
    {
        // Code here.
    }
}

и WebSnapshotSpecification:

public class WebSnapshotSpecification : Specification<WebSnapshot>
{
    public override Expression<Func<WebSnapshot, bool>> IsSatisfiedByExpression()
    {
        return (t) => true;
    }
}

которая является спецификацией WebSnapshot:

[DataContract(IsReference = true, Name = "WebSnapshot", Namespace = "MyProject.DomainModel.WebSnapshot")]
public class WebSnapshot
{
    [DataMember(Order = 1)]
    public virtual string Name { get; set; }
    [DataMember(Order = 2)]
    public virtual string PictureFilePath { get; set; }
    [DataMember(Order = 3)]
    public virtual int PictureHeight { get; set; }
    [DataMember(Order = 4)]
    public virtual int PictureWidth { get; set; }
}

наконец, вот Specification<TDomainModel>:

public abstract class Specification<TDomainModel>
{
    public virtual bool IsSatisfiedBy(TDomainModel domainObject)
    {
        return IsSatisfiedByExpression().Compile().Invoke(domainObject);
    }

    public virtual TDomainModel AssembleObject()
    {
        return Activator.CreateInstance<TDomainModel>();
    }

    public abstract Expression<Func<TDomainModel, bool>> IsSatisfiedByExpression();
}

1 Ответ

1 голос
/ 29 июля 2011

Похоже, вы пытаетесь отправить в службу экземпляр класса WebSnapshotSpecification и ожидаете, что WCF сериализует / десериализует IsSatisfiedByExpression метод , который он содержит.Этот сценарий не поддерживается в WCF.Если у класса WebSnapshotSpecification есть некоторые свойства, то они будут сериализованы / десериализованы, но методы никогда не будут частью неявного или явного определения DataContract WCF.

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