2013-02-18 72 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