3

私はパラメータとして抽象基本型Specification<TDomainModel>のパラメータを取るメソッドを持つWebサービスを持っています。私は、WCFが既知の型を指定せずにこれを直列化する方法を知らないことを認識しています。しかし、それらを指定しようとすると、まだ例外が発生します。CommunicationException:パラメータをシリアル化しようとしたときにエラーが発生しました

パラメータをシリアル化しようとしているときにエラーが発生しました。 InnerExceptionメッセージが 'WebSnapshotSpecification:http://schemas.datacontract.org/2004/07/MyProject.DomainModel.WebSnapshot'というデータコントラクト名を持つ 'MyProject.DomainModel.WebSnapshot.WebSnapshotSpecification'と入力されていません。 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; 
    } 
} 

の仕様です。 10:

[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

あなたがサービスにWebSnapshotSpecificationクラスのインスタンスを送信しようとしているとシリアル化するためにWCFを期待しているように思える/ IsSatisfiedByExpression 方法をデシリアライズを含む。このシナリオはWCFではサポートされていません。 WebSnapshotSpecificationクラスにいくつかのプロパティがある場合、それらはシリアル化/逆シリアル化されますが、メソッドはWCF暗黙的または明示的なDataContract定義の一部ではありません。

関連する問題