У меня есть веб-сервис с методом, который принимает параметр абстрактного базового типа 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();
}