版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)題26:二零二五年度企業(yè)間資料借用及知識(shí)產(chǎn)權(quán)保護(hù)合同3篇
- 2025年度農(nóng)村宅基地使用權(quán)轉(zhuǎn)讓合同
- 2025年度煤炭?jī)?chǔ)備居間調(diào)撥服務(wù)協(xié)議3篇
- 2025年度教育培訓(xùn)機(jī)構(gòu)兼職教師協(xié)議模板3篇
- 2025年度勞動(dòng)合同解除流程及補(bǔ)償金計(jì)算協(xié)議范本3篇
- 二零二五年度物流運(yùn)輸公司之間勞務(wù)協(xié)作與供應(yīng)鏈管理合同3篇
- 2025年農(nóng)村堰塘生態(tài)旅游開發(fā)與保護(hù)合同
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)整體轉(zhuǎn)讓合同版3篇
- 2025年度虛擬現(xiàn)實(shí)技術(shù)應(yīng)用合作全新簽約協(xié)議模板3篇
- 二零二五年度公租房合同續(xù)簽及配套設(shè)施更新協(xié)議3篇
- 體檢營(yíng)銷話術(shù)與技巧培訓(xùn)
- TSG 07-2019電梯安裝修理維護(hù)質(zhì)量保證手冊(cè)程序文件制度文件表單一整套
- 2023-2024學(xué)年浙江省杭州市西湖區(qū)五年級(jí)(上)期末數(shù)學(xué)試卷
- 建設(shè)工程造價(jià)案例分析-形成性考核2(占形考總分25%)-國(guó)開(SC)-參考資料
- 《期貨市場(chǎng)發(fā)展之》課件
- 系統(tǒng)解剖學(xué)(南方醫(yī)科大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年南方醫(yī)科大學(xué)
- 《生物質(zhì)熱電聯(lián)產(chǎn)工程設(shè)計(jì)規(guī)范》
- 科研倫理與學(xué)術(shù)規(guī)范期末考試
- 2022公務(wù)員錄用體檢操作手冊(cè)(試行)
- 噴嘴壓力計(jì)算表及選型
- 深化校企合作協(xié)同育人的實(shí)踐案例
評(píng)論
0/150
提交評(píng)論