日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解决WCF接口无法传递object参数的问题

發布時間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决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参数的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。