日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
WCF中幾個容易忽略的知識點

近來看WCF相關資料 發(fā)現(xiàn)之前一些沒太關注或者有些錯誤認識的知識點,有些也貌似不怎么常用。于是整理了這一則筆記。

1、 WCF中的綁定

可以通過綁定無參數(shù)構造函數(shù)實例化綁定,然后調用CreateBindingElements獲取到此種綁定的綁定元素。

 
 
 
 
  1. WSHttpBinding httpBinding = new WSHttpBinding();  
  2. BindingElementCollection collection = httpBinding.CreateBindingElements();  
  3. foreach (var element in collection)  
  4. {  
  5. Console.WriteLine(element.GetType().FullName);  

輸入如下:

如果對WSHttpBinding 更換一下構造函數(shù) ,如:

 
 
 
 
  1. httpBinding = new WSHttpBinding(SecurityMode.Transport); 

輸出結果如下:

如果對綁定指定一些配置,如安全配置,則它的綁定元素可能與調用無參數(shù)構造函數(shù)實例化對象調用CreateBindingElements獲取到的綁定元素不同。也就是說對于同一綁定,使用不同的配置可以更改它的綁定元素類型;不管采用何種配置,對綁定來說傳輸綁定與編碼綁定元素這兩個是必須的。

2、終結點契約配置

配置中的契約contracts不是契約接口的完全限定名,而是ServiceContractAttribute中ConfigurationName指定的名稱。如果沒有ConfigurationName配置,那么contracts的完全限定名與ConfigurationName指定的名稱相同。

3、 UnHandler處理器

如果在WCF中需要一個能處理所有消息的方法,而不關心SOAP消息的Action。那么操作方法的參數(shù)可以指定為Message。這種服務操作在WCF中被稱為UnHandler處理器。這種情況下,參數(shù)應為Message;返回值為void或者Meaage;

OperationCOntractAtrribte的Action設置為"*"

4、WCF序列化中Dos攻擊

WCF使用的序列化器DataContractSerializer在對數(shù)據(jù)契約進行序列化或者反序列化時,為了防止Dos攻擊,在

DataContractSerializer中使用MaxItemsInObjectGraph設置了每次序列化得對象數(shù)量。實際使用的時候可以在實現(xiàn)服務

契約接口的服務加上ServiceBehavior標簽中進行設置。如[ServiceBehavior(MaxItemsInObjectGraph = 60)];或者在serviceBehavior的配置中由dataContractSerializer指定。如

 
 
 
 
  1.  
  2.    
  3.  

5、泛型數(shù)據(jù)契約問題。

泛型為OO里的一種概念,而服務是基于SOA的,它沒有重載等概念。WCF的默認序列化器DataContractSerializer對

泛型數(shù)據(jù)契約的序列化,生成的XML默認的根節(jié)點元素名稱為:類型名+泛型名1+泛型名2+...+哈希碼。

可以通過指定模板的形式指定DataContractSerializer序列化后的根節(jié)點名:{0}{1}...{n}{#}。當然如果能保證數(shù)據(jù)契約名稱不重復,也可以直接在DataContract中通過Name指定。

6、自定義集合數(shù)據(jù)契約類型。

自定義集合數(shù)據(jù)契約:定義類,實現(xiàn)集合接口。如下定義:

 
 
 
 
  1. public class TeacherCollection : IEnumerable  
  2. {  
  3. private readonly IList teachers = new List();  
  4. public TeacherCollection()  
  5. {  
  6. }  
  7. public TeacherCollection(IList _teachers)  
  8. {  
  9. teachers = _teachers;  
  10. }  
  11. public void Add(Teacher teacher)  
  12. {  
  13. teachers.Add(teacher);  
  14. }  
  15. #region IEnumerable 成員  
  16. public IEnumerator GetEnumerator()  
  17. {  
  18. return teachers.GetEnumerator();  
  19. }  
  20. #endregion  
  21. #region IEnumerable 成員  
  22. IEnumerator IEnumerable.GetEnumerator()  
  23. {  
  24. return teachers.GetEnumerator();  
  25. }  
  26. #endregion  

在定義契約接口時,可以用自定義集合數(shù)據(jù)契約。它和IList的區(qū)別是:IList中Teacher才是數(shù)據(jù)契約,IList是數(shù)據(jù)契約的集合,而TeacherCollection是將整個集合對象最為數(shù)據(jù)契約。在WCF的默認的序列化器對TeacherCollection和IList的序列化的結果是相同的。

自定義集合契約,如果實現(xiàn)IList接口,則可以不需要添加Add,如果實現(xiàn)了IEmurable接口,則需要Add方法,并且需要有無參構造函數(shù)。為了簡化Add方法與構造函數(shù)可以讓自定義集合契約直接實現(xiàn)List。

對于自定義集合契約,WCF可以直接使用CollectionDataContract將其標記,泛型類T無需標記為DataContract。如下:

 
 
 
 
  1. [CollectionDataContract(Name = "TeacherList", ItemName = "TeacherEntry", Namespace = "cnblogs.com")]  
  2. public class Collection : List  
  3. {  
  4. private readonly IList teachers = new List();  

7、數(shù)據(jù)契約代理。

數(shù)據(jù)契約代理實現(xiàn)了IDataContractSurrogate。在WCF中,它可被用于WCF默認的序列器

DataContractSerializer中,用于將數(shù)據(jù)契約類與其他相似類型的轉化。以下實現(xiàn)Contract類型與數(shù)據(jù)契約Employee之間

的轉化。

示例代碼如下:

Contract類:

 
 
 
 
  1. public class Contract  
  2. {  
  3. public string FullName { get; set; }  
  4. public string Sex { get; set; }  

數(shù)據(jù)契約Employee:

 
 
 
 
  1. [DataContract]  
  2. public class Employee  
  3. {  
  4. [DataMember]  
  5. public string FirstName { get; set; }  
  6.  
  7. [DataMember]  
  8. public string LastName { get; set; }  
  9.  
  10. [DataMember]  
  11. public string Gender { get; set; }  

實現(xiàn)IDataContractSurrogate接口:

 
 
 
 
  1. class ContactSurrogate : IDataContractSurrogate  
  2. {  
  3.  
  4. #region IDataContractSurrogate 成員  
  5.  
  6. public object GetCustomDataToExport(Type clrType, Type dataContractType)  
  7. {  
  8. return null;  
  9. }  
  10.  
  11. public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)  
  12. {  
  13. return null;  
  14. }  
  15.  
  16. public Type GetDataContractType(Type type)  
  17. {  
  18. if (type==typeof(Contract))  
  19. {  
  20. return typeof (Employee);  
  21. }  
  22. return type;  
  23. }  
  24.  
  25. public object GetDeserializedObject(object obj, Type targetType)  
  26. {  
  27. Employee employee = obj as Employee;  
  28. if (employee==null)  
  29. {  
  30. return obj;  
  31. }  
  32. return new Contract {FullName = employee.FirstName + employee.LastName, Sex = employee.Gender};  
  33. }  
  34.  
  35. public void GetKnownCustomDataTypes(System.Collections.ObjectModel.Collection customDataTypes)  
  36. {  
  37.  
  38. }  
  39.  
  40. public object GetObjectToSerialize(object obj, Type targetType)  
  41. {  
  42. Contract contract = obj as Contract;  
  43. if (contract == null)  
  44. {  
  45. return obj;  
  46. }  
  47. return new Employee  
  48. {  
  49. FirstName = contract.FullName.Split(" ".ToArray(), StringSplitOptions.None)[0],  
  50. Gender = contract.Sex,  
  51. LastName = contract.FullName.Split(" ".ToArray(), StringSplitOptions.None)[1]  
  52. };  
  53. }  
  54.  
  55. public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)  
  56. {  
  57. return null;  
  58. }  
  59.  
  60. public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)  
  61. {  
  62. return typeDeclaration;  
  63. }  
  64.  
  65. #endregion  

使用ContactSurrogate進行序列化與反序列化的方法:

 
 
 
 
  1. public static void Serializer(T instance,string fileName,IDataContractSurrogate dataContractSurrogate)  
  2. {  
  3. DataContractSerializer serializer=new DataContractSerializer(typeof(T),null,Int32.MaxValue,false,false,dataContractSurrogate);  
  4. using(XmlWriter xmlWriter=XmlWriter.Create(fileName))  
  5. {  
  6. serializer.WriteObject(xmlWriter, instance);  
  7. }  
  8. Process.Start(fileName);  
  9. }  
  10.  
  11. public static T DeSerializer(string fileName,IDataContractSurrogate dataContractSurrogate)  
  12. {  
  13. DataContractSerializer serializer = new DataContractSerializer(typeof(T), new List(), Int32.MaxValue, false, false, dataContractSurrogate);  
  14. using (XmlReader xmlReader=XmlReader.Create(fileName))  
  15. {  
  16. object obj = serializer.ReadObject(xmlReader);  
  17. return (T) obj;  
  18. }  

現(xiàn)在對數(shù)據(jù)契約Employee使用Serializer進行序列化,然后將它序列化后的文件使用DeSerializer將它反序

列化成反序列化為Contract對象。

 
 
 
 
  1. Employee employee = new Employee {FirstName = "yongbo", Gender = "male", LastName = "Tao"};  
  2. ContactSurrogate contactSurrogate = new ContactSurrogate();  
  3. Tools.Serializer(employee, @"C:\DataContractSurrogate.txt", contactSurrogate);  
  4.  
  5. Contract obj = Tools.DeSerializer(@"C:\DataContractSurrogate.txt", contactSurrogate);  
  6. Console.WriteLine(string.Format("{0} 類型為:{1}。FullName is {2},Sex is {3}",obj,obj.GetType().FullName,obj.FullName,obj.Sex)); 

輸出如下:

原文鏈接:http://www.cnblogs.com/tyb1222/archive/2012/04/20/2458676.html

責任編輯:彭凡
來源: 博客園 WCF


本文標題:WCF中幾個容易忽略的知識點
URL鏈接:http://www.dlmjj.cn/article/dhgddeo.html