【问题标题】:Interface in a WCF DTOWCF DTO 中的接口
【发布时间】:2013-02-18 16:56:03
【问题描述】:

我尝试传输一个 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,}
}

问题是,如果我将 MyTestDto 从服务器传输到客户端,我总是会得到一个FaultException。我分析了 WSDL 文件,测试字段的类型为:AnyType。我想,这就是问题所在。我已经用抽象类替换了ITest,因此通信正常(当然我必须用抽象类设置ServiceKnownType 属性)。

你能帮帮我吗?为什么它适用于抽象类而不适用于接口?

【问题讨论】:

    标签: c# wcf


    【解决方案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)
    }
    

    【讨论】:

    • 感谢您的回答。我知道这一点,但我可以设置接口的具体类型,例如使用 KnownType 或 ServiceKnownType 属性?!
    • 无法通过网络发送接口;您需要将抽象类声明为基类而不是接口。
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2020-02-25
    • 2011-08-24
    • 2011-12-08
    相关资源
    最近更新 更多