Wcf CommunicationException:尝试序列化参数时出错

Wcf CommunicationException:尝试序列化参数时出错,wcf,web-services,serialization,datacontractserializer,datacontract,Wcf,Web Services,Serialization,Datacontractserializer,Datacontract,我有一个Web服务,其方法将抽象基类型的参数Specification作为参数。我意识到WCF不知道如何在不指定已知类型的情况下对其进行反/序列化。但当我尝试指定它们时,仍然会出现以下异常: 尝试序列化参数时出错。InnerException消息为“Type”MyProject.DomainModel.WebSnapshot.WebSnapshotSpecification”,数据协定名称为“WebSnapshotSpecification”:http://schemas.datacontrac

我有一个Web服务,其方法将抽象基类型的参数
Specification
作为参数。我意识到WCF不知道如何在不指定已知类型的情况下对其进行反/序列化。但当我尝试指定它们时,仍然会出现以下异常:

尝试序列化参数时出错。InnerException消息为“Type”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.
    }
}
这是
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; }
}
最后,这里是
规范

public class WebSnapshotSpecification : Specification<WebSnapshot>
{
    public override Expression<Func<WebSnapshot, bool>> IsSatisfiedByExpression()
    {
        return (t) => true;
    }
}
公共抽象类规范
{
公共虚拟bool由(TDomainModel domainObject)满足
{
返回issatifiedbyexpression().Compile().Invoke(domainObject);
}
公共虚拟TDomainModel AssembleObject()
{
返回Activator.CreateInstance();
}
公共抽象表达式为satifiedbyexpression();
}

您似乎正在尝试向服务发送WebSnapshotSpecification类实例,并希望WCF序列化/反序列化它包含的IssatifiedByExpression方法。WCF不支持这种情况。如果WebSnapshotSpecification类有一些属性,那么这些属性将被序列化/反序列化,但方法永远不是WCF隐式或显式DataContract定义的一部分

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();
}