自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

WCF中幾個容易忽略的知識點

開發(fā) 后端
我們今天將談到WCF中的綁定、終結(jié)點契約配置、UnHandler處理器、WCF序列化中Dos攻擊、自定義集合數(shù)據(jù)契約類型等知識點。

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

1、 WCF中的綁定

可以通過綁定無參數(shù)構(gòu)造函數(shù)實例化綁定,然后調(diào)用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 更換一下構(gòu)造函數(shù) ,如:

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

輸出結(jié)果如下:

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

2、終結(jié)點契約配置

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

3、 UnHandler處理器

如果在WCF中需要一個能處理所有消息的方法,而不關(guān)心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. <behavior name="serviceBehavior"> 
  2. <dataContractSerializer maxItemsInObjectGraph="1000"/>   
  3. </behavior> 

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<Teacher>  
  2. {  
  3. private readonly IList<Teacher> teachers = new List<Teacher>();  
  4. public TeacherCollection()  
  5. {  
  6. }  
  7. public TeacherCollection(IList<Teacher> _teachers)  
  8. {  
  9. teachers = _teachers;  
  10. }  
  11. public void Add(Teacher teacher)  
  12. {  
  13. teachers.Add(teacher);  
  14. }  
  15. #region IEnumerable<Teacher> 成員  
  16. public IEnumerator<Teacher> 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<Teacher>的區(qū)別是:IList<Teacher>中Teacher才是數(shù)據(jù)契約,IList<Teacher>是數(shù)據(jù)契約的集合,而TeacherCollection是將整個集合對象最為數(shù)據(jù)契約。在WCF的默認的序列化器對TeacherCollection和IList<Teacher>的序列化的結(jié)果是相同的。

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

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

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

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

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

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

的轉(zhuǎn)化。

示例代碼如下:

Contract類:

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

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

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

實現(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<Type> 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>(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<T>(string fileName,IDataContractSurrogate dataContractSurrogate)  
  12. {  
  13. DataContractSerializer serializer = new DataContractSerializer(typeof(T), new List<Type>(), Int32.MaxValue, falsefalse, 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<T>進行序列化,然后將它序列化后的文件使用DeSerializer<T>將它反序

列化成反序列化為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<Contract>(@"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)); 

輸出如下:

責任編輯:彭凡 來源: 博客園
相關(guān)推薦

2012-05-08 09:10:56

WCF

2022-03-02 08:01:31

面試前端開發(fā)

2015-04-21 09:28:29

2019-12-03 08:13:06

BDRDR路由器

2019-10-17 15:10:33

PHP程序員Linux

2020-08-04 07:02:00

TCPIP算法

2017-01-15 01:12:40

碼農(nóng)簡歷專業(yè)名詞

2010-08-30 19:42:45

DHCP服務器

2021-06-11 11:42:57

Swift 函數(shù)生成器結(jié)果生成器

2009-04-01 11:39:39

視圖DB2

2022-02-07 00:10:28

Docker容器開發(fā)

2021-06-29 15:56:39

MYSQL開發(fā)數(shù)據(jù)庫

2019-06-06 15:49:53

多線程iOS開發(fā)操作

2022-08-03 08:03:03

前端APIjavascript

2016-05-30 17:31:34

Spring框架

2010-08-17 14:56:00

HCNE認證

2011-04-15 12:25:21

BGP路由

2014-06-10 13:44:58

iOSUIImage知識點

2020-11-06 00:50:16

JavaClassLoaderJVM

2021-04-29 10:01:30

JavaMathJava編程
點贊
收藏

51CTO技術(shù)棧公眾號