3

I have a webservice with a method that takes a parameter of abstract base type Specification<TDomainModel> as parameter. I realize that WCF don't know how to de-/serialize this without specifying known types. But when I try to specify them, I still get this exception:

There was an error while trying to serialize parameter http://myproject.org:specification. The InnerException message was 'Type 'MyProject.DomainModel.WebSnapshot.WebSnapshotSpecification' with data contract name 'WebSnapshotSpecification:http://schemas.datacontract.org/2004/07/MyProject.DomainModel.WebSnapshot' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

If anyone can see where I have missed something, it would be very much appreciated :) The classes looks as follows:

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.
    }
}

and WebSnapshotSpecification:

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

which is a specification of 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; }
}

finally, here is 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 Answer 1

1

It seems like you are trying to send a WebSnapshotSpecification class instance to the service and are expecting WCF to serialize/deserialize the IsSatisfiedByExpression method it contains. That scenario is not supported in WCF. If the WebSnapshotSpecification class had some properties then those will be serialized/deserialized but methods are never part of a WCF implicit or explicit DataContract definition.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.