WCF 學(xué)習(xí)總結(jié)6 -- WCF參數(shù)與返回值_第1頁
WCF 學(xué)習(xí)總結(jié)6 -- WCF參數(shù)與返回值_第2頁
WCF 學(xué)習(xí)總結(jié)6 -- WCF參數(shù)與返回值_第3頁
WCF 學(xué)習(xí)總結(jié)6 -- WCF參數(shù)與返回值_第4頁
WCF 學(xué)習(xí)總結(jié)6 -- WCF參數(shù)與返回值_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Message是WCF信道層提供的一個(gè)類,在Message類里,數(shù)據(jù)被標(biāo)識(shí)成一個(gè)XML Information Set, 簡(jiǎn)稱為InfoSet。當(dāng)數(shù)據(jù)從客戶端傳輸給服務(wù)端時(shí),binding里指定的消息編碼協(xié)議將決定包含客戶端所提供數(shù)據(jù)的Message對(duì)象將以何種形式提供給服務(wù)(服務(wù)端到客戶端也一樣)。然而,所有標(biāo)準(zhǔn)的binding都會(huì)使用將Message對(duì)象表示成XML InfoSet的編碼協(xié)議。根據(jù)預(yù)定義binding的編碼協(xié)議,XML InfoSet可能會(huì)使用各種標(biāo)準(zhǔn)的XML文本編碼、MTOM或者二進(jìn)制格式。也就是說從WCF應(yīng)用層到傳輸將會(huì)是下面這個(gè)過程: 序列化>(XML

2、 InfoSet)>編碼(Text/MTOM/Binary)>傳輸>解碼>(XML InfoSet)>反序列化 WCF提供了兩種XML序列化的工具來完成:DataContractSerializer和XmlSerializer。 那么,WCF支持哪些類型的參數(shù)和返回值呢?當(dāng)然WCF里推薦使用DataContract和DataMember來定義復(fù)雜的自定義對(duì)象,但是在WebService時(shí)代里,我們知道只要實(shí)體類或者其父類被標(biāo)識(shí)為Serializable就支持序列化了,就可以作為WebMethod的參數(shù)或者返回值了。在有些場(chǎng)景,已經(jīng)生成好眾多實(shí)體

3、類,又不想一個(gè)個(gè)為每個(gè)屬性加上DataMember,自然很懷念Serializable。OK,下面來看看代碼: 1. 服務(wù)契約: c-sharp view plain copy1. using System;  2. using System.Collections.Generic;  3. using System.Linq;  4. using System.Runtime.Serialization;  5. using 

4、;System.ServiceModel;  6. using System.ServiceModel.Web;  7. using System.Data;  8. namespace WcfService  9.   10.     ServiceContract  11.     /XmlSerializerFormat  12.  

5、;   public interface IService1  13.       14.         OperationContract  15.         List<CustomerObjectOfDataContract> GetDataFromLis

6、tOfDataContract();  16.         OperationContract  17.         List<CustomerObjectOfSerializable> GetDataFromListOfSerializable();  18.        &

7、#160;OperationContract  19.         DataTable GetDataFromDataTable();  20.       21.     DataContract  22.     public class CustomerObjectOfDataC

8、ontract  23.       24.         DataMember  25.         public string Name  get; set;   26.       

9、60; DataMember  27.         public string Code  get; set;   28.       29.     Serializable  30.     public class Cu

10、stomerObjectOfSerializable  31.       32.         public string Name  get; set;   33.         public string Code  get;&#

11、160;set;   34.       35.   2. 服務(wù)實(shí)現(xiàn): c-sharp view plain copy1. using System;  2. using System.Collections.Generic;  3. using System.Linq;  4. using System.Runtime.Serialization;

12、0; 5. using System.ServiceModel;  6. using System.ServiceModel.Web;  7. using System.Text;  8. using System.Data;  9. namespace WcfService  10.   11.     public class Service1 

13、;: IService1  12.       13.         #region IService1 Members  14.         public List<CustomerObjectOfDataContract> GetDataFromListOfDataC

14、ontract()  15.           16.             return new List<CustomerObjectOfDataContract>  17.           &#

15、160;   18.                 new CustomerObjectOfDataContract  Name = "test1", Code = "aaa" ,  19.      

16、60;          new CustomerObjectOfDataContract  Name = "test2", Code = "bbb" ,  20.                &#

17、160;new CustomerObjectOfDataContract  Name = "test3", Code = "ccc"   21.               22.           23.

18、        public List<CustomerObjectOfSerializable> GetDataFromListOfSerializable()  24.           25.             return 

19、;new List<CustomerObjectOfSerializable>  26.               27.                 new CustomerObjectOfSerializable  N

20、ame = "test1", Code = "111" ,  28.                 new CustomerObjectOfSerializable  Name = "test2", Code = &q

21、uot;222" ,  29.                 new CustomerObjectOfSerializable  Name = "test3", Code = "333"   30.     

22、          31.           32.         public DataTable GetDataFromDataTable()  33.           

23、;34.             var data = new DataTable("DataTable");  35.             data.Columns.Add("Name", typeof(string);  

24、36.             data.Columns.Add("Code", typeof(string);  37.             data.Rows.Add(new object  "aaa", "111"

25、60;);  38.             data.Rows.Add(new object  "bbb", "222" );  39.             data.Rows.Add(new object

26、0; "ccc", "333" );  40.             return data;  41.           42.    43.       

27、0; #endregion  44.       45.   3. 客戶端: c-sharp view plain copy1. using System;  2. using System.Collections.Generic;  3. using System.Linq;  4. using System.Text;  5. usi

28、ng System.Data;  6. namespace WcfClient  7.   8.     class Program  9.       10.         static void Main(string args)  11.  

29、         12.             WcfSvc.Service1Client client = new WcfSvc.Service1Client();  13.             Con

30、sole.ForegroundColor = ConsoleColor.Yellow;  14.             Console.WriteLine("List<T> DataContract:");  15.             var

31、0;data1 = client.GetDataFromListOfDataContract();  16.             foreach (var obj in data1)  17.                &

32、#160;Console.WriteLine("0,1", obj.Name, obj.Code);  18.             Console.WriteLine();  19.             Console.ForegroundColor =

33、0;ConsoleColor.Green;  20.             Console.WriteLine("List<T> Serializable:");  21.             var data2 = client.GetDa

34、taFromListOfSerializable();  22.             foreach (var obj in data2)  23.                 Console.WriteLine("0,1

35、", obj.Namek_BackingField, obj.Codek_BackingField);  24.             Console.WriteLine();  25.             Console.ForegroundColor = Co

36、nsoleColor.Red;  26.             Console.WriteLine("System.Data.DataTable:");  27.             var data3 = client.GetDataFromDataTable(

37、);  28.             foreach (DataRow row in data3.Rows)  29.                 Console.WriteLine("0,1", row

38、0, row1);  30.             Console.WriteLine();  31.             Console.Read();  32.           

39、;33.       34.   4. 運(yùn)行:  運(yùn)行結(jié)果說明:WCF除了支持默認(rèn)的DataContract對(duì)象以外,還支持Serializble對(duì)象,DataTable也是被支持的。 但是用DataTable作為參數(shù)或者返回值時(shí),DataTable的TableName一定不能為空。否則會(huì)拋出下面的錯(cuò)誤:The underlying connection was closed: The connection was closed unexpectedly.光看這個(gè)異常,還真不知道哪不對(duì)

40、了。就算你沒有調(diào)用帶DataTable的方法,也不行。很詭異的錯(cuò)誤提示。另外,大家注意到這個(gè)細(xì)節(jié)了沒有。服務(wù)端定義的對(duì)象,在客戶端生成的代理卻是這樣的?  所有字段都加上了 k_BackingField,原因是默認(rèn)的DataContractSerializer序列化搞的鬼 DataContract的Response Message XML InfoSet xhtml view plain copy1. <s:Envelope xmlns:s="/soap/en

41、velope/">  2.   <s:Header />  3.   <s:Body>  4.     <GetDataFromListOfDataContractResponse xmlns="/">  5.       <GetDataFrom

42、ListOfDataContractResult xmlns:a="/2004/07/WcfService" xmlns:i="/2001/XMLSchema-instance">  6.         <a:CustomerObjectOfDataContract>  7.   

43、60;       <a:Code>aaa</a:Code>  8.           <a:Name>test1</a:Name>  9.         </a:CustomerObjectOfDataContract>  

44、10.         <a:CustomerObjectOfDataContract>  11.           <a:Code>bbb</a:Code>  12.           <a:Name>test2</a:

45、Name>  13.         </a:CustomerObjectOfDataContract>  14.         <a:CustomerObjectOfDataContract>  15.           <a:Code&

46、gt;ccc</a:Code>  16.           <a:Name>test3</a:Name>  17.         </a:CustomerObjectOfDataContract>  18.       </GetDataFr

47、omListOfDataContractResult>  19.     </GetDataFromListOfDataContractResponse>  20.   </s:Body>  Serializable的Response Message XML InfoSet,真是面目全非了。 xhtml view plain copy1. <s:Envelope xmlns:s="http:

48、//soap/envelope/">  2.   <s:Header />  3.   <s:Body>  4.     <GetDataFromListOfSerializableResponse xmlns="/">  5.     

49、;  <GetDataFromListOfSerializableResult xmlns:a="/2004/07/WcfService" xmlns:i="/2001/XMLSchema-instance">  6.         <a:CustomerObjectOfSerializable>&#

50、160; 7.           <a:_x003C_Code_x003E_k_BackingField>111</a:_x003C_Code_x003E_k_BackingField>  8.           <a:_x003C_Name_x003E_k_BackingField>test1</a:_x003C_Nam

51、e_x003E_k_BackingField>  9.         </a:CustomerObjectOfSerializable>  10.         <a:CustomerObjectOfSerializable>  11.          

52、 <a:_x003C_Code_x003E_k_BackingField>222</a:_x003C_Code_x003E_k_BackingField>  12.           <a:_x003C_Name_x003E_k_BackingField>test2</a:_x003C_Name_x003E_k_BackingField>  13.     

53、    </a:CustomerObjectOfSerializable>  14.         <a:CustomerObjectOfSerializable>  15.           <a:_x003C_Code_x003E_k_BackingField>333</a:_x003C_

54、Code_x003E_k_BackingField>  16.           <a:_x003C_Name_x003E_k_BackingField>test3</a:_x003C_Name_x003E_k_BackingField>  17.         </a:CustomerObjectOfSerializable>&#

55、160; 18.       </GetDataFromListOfSerializableResult>  19.     </GetDataFromListOfSerializableResponse>  20.   </s:Body>  21. </s:Envelope>  原因應(yīng)該是DataContractSerializer(Sy

56、stem.Runtime.Serialization命名空間下)是在實(shí)際訪問方法時(shí),對(duì)參數(shù)列表的對(duì)象進(jìn)行序列化。標(biāo)識(shí)為DataMember特性的DataContract能夠別識(shí)別并正常的序列化,而Serializable對(duì)象只能通過反射,而被反射出來的Public Field被加進(jìn)去了不想要的東西。 解決辦法也簡(jiǎn)單:就是改用XmlSerializer代替DataContractSerializer。只要在服務(wù)契約上聲明一下: XmlSerializerFormat特性就可以了。ServiceContractXmlSerializerFormatpublic interfac

57、e IService1    OperationContract    List<CustomerObjectOfDataContract> GetDataFromListOfDataContract();    OperationContract    List<CustomerObjectOfSerializable> GetDataFromListOfSerializable();    OperationContract    DataTable GetDataFromDataTable();使用XmlSerializerFormat后,Serializable的Response Message XML InfoSet: xhtml view plain copy1. <s:Envelope xmlns:s="/soap/envelope/">  

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論