2013-02-18 79 views
1

我尝试传送一个包含具有接口的子项目的DTO(WCF客户端到WCF服务器)。WCF DTO中的接口

我的代码:

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文件,测试字段的类型为:AnyType。我认为,这是问题所在。我已经用抽象类替换了ITest,因此通信起作用(当然,我必须使用抽象类来设置ServiceKnownType属性)。

你能帮我吗?为什么它可以与抽象类一起使用,而不是与接口一起使用?

回答

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) 
} 
+0

感谢您的回答。我知道这一点,但我可以设置界面的具体类型,例如与KnownType或ServiceKnownType属性?! – bitsmuggler 2013-02-18 08:52:22

+0

无法通过电线发送接口;你需要声明一个抽象类作为基础而不是接口。 – daryal 2013-02-18 08:55:12