解决WCF接口无法传递object参数的问题
? 在某些場合中,我們需要提供以object為參數的方法。不過在WCF中,由于需要序列化與反序列化,因此它要求所有WCF傳遞的參數類型都是已知的,無法傳遞object這種未知類型。即使用了KnownType來標記自定義對象,也無法調用。以下代碼無法正常執行:
??? [DataContract]
??? public class Product
??? {
??????? [DataMember]
??????? public string Name;
?? ?}
??? [ServiceContract]
??? public interface IProductInfo
??? {
??????? [OperationContract]
??????? string GetProductTypeName(Object obj);
??? }
????[KnownType(typeof(Product))]
??? public class ProductInfo : IProductInfo
??? {
???????? public string GetProductTypeName(Object obj)
???????? {
?????????????? return obj.ToString();
???????? }
???? }
????? 調用時:
????? ProductInfoClient client = new ProductInfoClient ();
????? client.GetProductTypeName("傳字符串類型,調用成功");
??????client.GetProductTypeName(new Product()); //報錯
????? 不過,可以通過定義一個中間類型來傳遞object對象。方法就是在這個類型中包含一個object的成員,并且定義該成員為KnownType。代碼如下:
??? [DataContract]
??? [KnownType(typeof(Product))]?//必須標記Product類型
??? public class RequestData
??? {
??????? [DataMember]
????????public object RequestObject;
??? }
???? 通過傳遞RequestData,就能變相實現object對象的傳遞。
??? [ServiceContract]
??? public interface IProductInfo
??? {
??????? [OperationContract]
??????? string GetProductTypeName(RequestData requestData);
??? }
??? public class ProductInfo : IProductInfo
??? {
???????? public string GetProductTypeName(RequestData requestData)
???????? {
?????????????? return requestData.RequestObject.ToString();
???????? }
???? }
?????不過,你會發現任何自定義對象都必須在RequestData中預先設定為KnownType,否則WCF無法序列化。這顯然還不夠靈活。為了讓方法可以方便的調用,而不需要擔心是否標記了KnownType,我們可以通過定義一個方法并把這個方法名作為KnownType參數來解決此問題。這里用到KnownType的另一個重載方法:
????? KnownTypeAttribute(string methodName);
???? 這個方法必須滿足以下條件:
???? a 必須是static,因為需要在對象實例化之前調用。
???? b 必須是不帶任何參數的。
???? C 返回類型必須是可被IEnumerable接受的,(也就是實現了IEnumerable接口的)。
?????改造后RequestData如下:
???? [DataContract]
????[KnownType("GetKnownType")]
??? public class RequestData
??? {
??????? //增加構造函數方便使用
??????? public RequestData(object requestObj)
??????? {
???????????????? RequestObject = requestObj;
???????? }
??????? [DataMember]
??????? public object RequestObject;
??????? private static Type[] GetKnownType()
??????? {
????????????//將自定義對象的程序集下的所有類型標記為KnownType。
??????????? return Assembly.Load("DataEntityAssemblyName").GetTypes();
??????? }
??? }
????在GetKnownType函數中,程序將自定義類型的程序集包含的類型全部返回,這下就省事多了。。
轉載于:https://www.cnblogs.com/guanshan/p/guan041.html
總結
以上是生活随笔為你收集整理的解决WCF接口无法传递object参数的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言递归练习
- 下一篇: Lync Server的环境搭建(五):