在 WCF 中能不能傳 object 型別?

WCF 中 object 的處理。

今天剛好看到一則問題:在 WCF 中能否傳遞 object 類型的物件?

以往在開發 ASMX Web Service (俗稱的 ASP.NET XML Web Service) 時,有時候為了圖方便,會想要直接傳遞 object 類型的變數回到前端,是可以成功的,不過在 WCF 中,由於它要求所有在 WCF 資料流中通訊的物件資料都必須要有一個明確的型別,以利 WCF 的序列化與反序列化用,因此它無法傳遞 object 這種未知型別的物件,所以 WCF 在預設情況下,只能夠傳遞由資料合約 (Data Contract) 所描述的物件 (此即已知型別問題,是一種由開發團隊所設計的行為)。

不過,如果你認定該 object 代表的型別的話,你就必須要在資料合約中加上 KnownTypeAttribute 宣告,讓 WCF 的序列化引擎可以把 KnownTypeAttribute 所定義的型別當做 object 的預設型別,如此就可以在資料合約中使用 object 型別的資料了。

[DataContract]
[KnownType(typeof(UserAccount))]

public class Response
{

   [DataMember]
   public string ResponseText;

   [DataMember]
   public bool CompletedSuccesfully;

   [DataMember]
   public object ResponseObject;

}