1

インターフェイスを持つ suboject を含む DTO (WCF クライアントから WCF サーバーへ) を送信しようとしています。

私のコード:

WCF サービス メソッド:

[OperationBehavior(TransactionScopeRequired = true)]
public void SendTest(MyTestDto testDto)
{
  ...
}

MyTestDto クラス:

[Serializable]
[DataContract(Name = "MyTestDto")]
public class MyTestDto : ITestDto
{
   [DataMember(IsRequired = true, Order = 1, Name = "MyTestDto")]
   [DataMemberValidation(IsRequired = true)]
   public ITest Test { get; set; }

}

ITest インターフェイス:

public interface ITest
{
    int Field1 {get;set;}
    int Field2 {get;set,}
}

問題は、FaultExceptionサーバーからクライアントに MyTestDto を送信すると、常にエラーが発生することです。WSDL ファイルを分析したところ、テスト フィールドは Type:AnyTypeでした。これが問題だと思います。ITestを抽象クラスに置き換えたので、通信が機能します (もちろん、ServiceKnownType属性を抽象クラスに設定する必要があります)。

手伝って頂けますか?インターフェイスではなく抽象クラスで機能するのはなぜですか?

4

1 に答える 1

1

WCF は具象型で動作し、インターフェイスは WCF 経由でシリアル化できません。

インターフェイスを抽象クラスにすることは、サービスを属性でマークした場合、ServiceKnownTypeまたはデータ コントラクトをKnownType属性でマークした場合にのみ機能します。以下は例です。

public abstract Test
{
    public int Field1 {get;set;}
    public int Field2 {get;set,}
}

public class SomeTest : Test
{ 
    ...
}

[ServiceKnownType(typeof(SomeTest))]
public class SomeService : ISomeService
{
     public void SendTest(Test test)
}
于 2013-02-18T08:50:44.727 に答える