




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Message是WCF信道層提供的一個類,在Message類里,數(shù)據(jù)被標(biāo)識成一個XML Information Set, 簡稱為InfoSet。當(dāng)數(shù)據(jù)從客戶端傳輸給服務(wù)端時,binding里指定的消息編碼協(xié)議將決定包含客戶端所提供數(shù)據(jù)的Message對象將以何種形式提供給服務(wù)(服務(wù)端到客戶端也一樣)。然而,所有標(biāo)準(zhǔn)的binding都會使用將Message對象表示成XML InfoSet的編碼協(xié)議。根據(jù)預(yù)定義binding的編碼協(xié)議,XML InfoSet可能會使用各種標(biāo)準(zhǔn)的XML文本編碼、MTOM或者二進制格式。也就是說從WCF應(yīng)用層到傳輸將會是下面這個過程: 序列化>(XML
2、 InfoSet)>編碼(Text/MTOM/Binary)>傳輸>解碼>(XML InfoSet)>反序列化 WCF提供了兩種XML序列化的工具來完成:DataContractSerializer和XmlSerializer。 那么,WCF支持哪些類型的參數(shù)和返回值呢?當(dāng)然WCF里推薦使用DataContract和DataMember來定義復(fù)雜的自定義對象,但是在WebService時代里,我們知道只要實體類或者其父類被標(biāo)識為Serializable就支持序列化了,就可以作為WebMethod的參數(shù)或者返回值了。在有些場景,已經(jīng)生成好眾多實體
3、類,又不想一個個為每個屬性加上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ù)實現(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. 運行: 運行結(jié)果說明:WCF除了支持默認的DataContract對象以外,還支持Serializble對象,DataTable也是被支持的。 但是用DataTable作為參數(shù)或者返回值時,DataTable的TableName一定不能為空。否則會拋出下面的錯誤:The underlying connection was closed: The connection was closed unexpectedly.光看這個異常,還真不知道哪不對
40、了。就算你沒有調(diào)用帶DataTable的方法,也不行。很詭異的錯誤提示。另外,大家注意到這個細節(jié)了沒有。服務(wù)端定義的對象,在客戶端生成的代理卻是這樣的? 所有字段都加上了 k_BackingField,原因是默認的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ù)列表的對象進行序列化。標(biāo)識為DataMember特性的DataContract能夠別識別并正常的序列化,而Serializable對象只能通過反射,而被反射出來的Public Field被加進去了不想要的東西。 解決辦法也簡單:就是改用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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鄆城幼兒面試試題及答案
- 6-甲?;?5-(三氟甲基)煙酸乙酯hplc
- 5年級下冊英語第4單元單詞跟讀
- 5年級上冊簡易方程
- 4年級下冊日積月累1~8單元
- 地下建筑火災(zāi)案例
- 2025年云南旅游職業(yè)學(xué)院單招職業(yè)傾向性測試題庫帶答案
- 2025年天津濱海職業(yè)學(xué)院單招職業(yè)傾向性測試題庫完美版
- 2025年南充文化旅游職業(yè)學(xué)院單招職業(yè)技能測試題庫及答案1套
- 2025年重慶資源與環(huán)境保護職業(yè)學(xué)院單招職業(yè)技能測試題庫1套
- 自然環(huán)境及特征(考向3:自然環(huán)境的地域差異(雪線、林線)) 【知識精講精研】 高考地理二輪核心考點突破課堂
- GB/T 43200-2023機器人一體化關(guān)節(jié)性能及試驗方法
- 園林噴灌工程施工方案
- 紅樓夢第二回極好課件
- 混凝土回彈數(shù)據(jù)自動計算表格
- 家庭節(jié)約用水
- 《材料性能學(xué)》教案
- 道路交通事故現(xiàn)場勘查與處置
- 電噴系統(tǒng)原理及故障維修手冊
- 環(huán)境影響評價報告公示-全椒縣水務(wù)全椒縣第二自來水廠擴建工程環(huán)境影響報告書公示全環(huán)評報告
- 名班主任工作室成員成長檔案
評論
0/150
提交評論