EndpointAddress10.cs 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System;
  7. using System.ServiceModel.Channels;
  8. using System.Xml;
  9. using System.Xml.Schema;
  10. using System.Xml.Serialization;
  11. using System.Collections;
  12. using System.Text;
  13. using System.IO;
  14. [XmlSchemaProvider("GetSchema")]
  15. [XmlRoot(AddressingStrings.EndpointReference, Namespace = Addressing10Strings.Namespace)]
  16. public class EndpointAddress10 : IXmlSerializable
  17. {
  18. static XmlQualifiedName eprType;
  19. EndpointAddress address;
  20. // for IXmlSerializable
  21. EndpointAddress10()
  22. {
  23. this.address = null;
  24. }
  25. EndpointAddress10(EndpointAddress address)
  26. {
  27. this.address = address;
  28. }
  29. public static EndpointAddress10 FromEndpointAddress(EndpointAddress address)
  30. {
  31. if (address == null)
  32. {
  33. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
  34. }
  35. return new EndpointAddress10(address);
  36. }
  37. public EndpointAddress ToEndpointAddress()
  38. {
  39. return this.address;
  40. }
  41. void IXmlSerializable.ReadXml(XmlReader reader)
  42. {
  43. this.address = EndpointAddress.ReadFrom(AddressingVersion.WSAddressing10, XmlDictionaryReader.CreateDictionaryReader(reader));
  44. }
  45. void IXmlSerializable.WriteXml(XmlWriter writer)
  46. {
  47. this.address.WriteContentsTo(AddressingVersion.WSAddressing10, XmlDictionaryWriter.CreateDictionaryWriter(writer));
  48. }
  49. static XmlQualifiedName EprType
  50. {
  51. get
  52. {
  53. if (eprType == null)
  54. eprType = new XmlQualifiedName(AddressingStrings.EndpointReferenceType, Addressing10Strings.Namespace);
  55. return eprType;
  56. }
  57. }
  58. static XmlSchema GetEprSchema()
  59. {
  60. using (XmlTextReader reader = new XmlTextReader(new StringReader(Schema)))
  61. {
  62. return XmlSchema.Read(reader, null);
  63. }
  64. }
  65. public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
  66. {
  67. if (xmlSchemaSet == null)
  68. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlSchemaSet");
  69. XmlQualifiedName eprType = EprType;
  70. XmlSchema eprSchema = GetEprSchema();
  71. ICollection schemas = xmlSchemaSet.Schemas(Addressing10Strings.Namespace);
  72. if (schemas == null || schemas.Count == 0)
  73. xmlSchemaSet.Add(eprSchema);
  74. else
  75. {
  76. XmlSchema schemaToAdd = null;
  77. foreach (XmlSchema xmlSchema in schemas)
  78. {
  79. if (xmlSchema.SchemaTypes.Contains(eprType))
  80. {
  81. schemaToAdd = null;
  82. break;
  83. }
  84. else
  85. schemaToAdd = xmlSchema;
  86. }
  87. if (schemaToAdd != null)
  88. {
  89. foreach (XmlQualifiedName prefixNsPair in eprSchema.Namespaces.ToArray())
  90. schemaToAdd.Namespaces.Add(prefixNsPair.Name, prefixNsPair.Namespace);
  91. foreach (XmlSchemaObject schemaObject in eprSchema.Items)
  92. schemaToAdd.Items.Add(schemaObject);
  93. xmlSchemaSet.Reprocess(schemaToAdd);
  94. }
  95. }
  96. return eprType;
  97. }
  98. XmlSchema IXmlSerializable.GetSchema()
  99. {
  100. return null;
  101. }
  102. const string Schema =
  103. @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:wsa='http://www.w3.org/2005/08/addressing' targetNamespace='http://www.w3.org/2005/08/addressing' blockDefault='#all' elementFormDefault='qualified' finalDefault='' attributeFormDefault='unqualified'>
  104. <!-- Constructs from the WS-Addressing Core -->
  105. <xs:element name='EndpointReference' type='wsa:EndpointReferenceType'/>
  106. <xs:complexType name='EndpointReferenceType' mixed='false'>
  107. <xs:sequence>
  108. <xs:element name='Address' type='wsa:AttributedURIType'/>
  109. <xs:element name='ReferenceParameters' type='wsa:ReferenceParametersType' minOccurs='0'/>
  110. <xs:element ref='wsa:Metadata' minOccurs='0'/>
  111. <xs:any namespace='##other' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
  112. </xs:sequence>
  113. <xs:anyAttribute namespace='##other' processContents='lax'/>
  114. </xs:complexType>
  115. <xs:complexType name='ReferenceParametersType' mixed='false'>
  116. <xs:sequence>
  117. <xs:any namespace='##any' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
  118. </xs:sequence>
  119. <xs:anyAttribute namespace='##other' processContents='lax'/>
  120. </xs:complexType>
  121. <xs:element name='Metadata' type='wsa:MetadataType'/>
  122. <xs:complexType name='MetadataType' mixed='false'>
  123. <xs:sequence>
  124. <xs:any namespace='##any' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
  125. </xs:sequence>
  126. <xs:anyAttribute namespace='##other' processContents='lax'/>
  127. </xs:complexType>
  128. <xs:element name='MessageID' type='wsa:AttributedURIType'/>
  129. <xs:element name='RelatesTo' type='wsa:RelatesToType'/>
  130. <xs:complexType name='RelatesToType' mixed='false'>
  131. <xs:simpleContent>
  132. <xs:extension base='xs:anyURI'>
  133. <xs:attribute name='RelationshipType' type='wsa:RelationshipTypeOpenEnum' use='optional' default='http://www.w3.org/2005/08/addressing/reply'/>
  134. <xs:anyAttribute namespace='##other' processContents='lax'/>
  135. </xs:extension>
  136. </xs:simpleContent>
  137. </xs:complexType>
  138. <xs:simpleType name='RelationshipTypeOpenEnum'>
  139. <xs:union memberTypes='wsa:RelationshipType xs:anyURI'/>
  140. </xs:simpleType>
  141. <xs:simpleType name='RelationshipType'>
  142. <xs:restriction base='xs:anyURI'>
  143. <xs:enumeration value='http://www.w3.org/2005/08/addressing/reply'/>
  144. </xs:restriction>
  145. </xs:simpleType>
  146. <xs:element name='ReplyTo' type='wsa:EndpointReferenceType'/>
  147. <xs:element name='From' type='wsa:EndpointReferenceType'/>
  148. <xs:element name='FaultTo' type='wsa:EndpointReferenceType'/>
  149. <xs:element name='To' type='wsa:AttributedURIType'/>
  150. <xs:element name='Action' type='wsa:AttributedURIType'/>
  151. <xs:complexType name='AttributedURIType' mixed='false'>
  152. <xs:simpleContent>
  153. <xs:extension base='xs:anyURI'>
  154. <xs:anyAttribute namespace='##other' processContents='lax'/>
  155. </xs:extension>
  156. </xs:simpleContent>
  157. </xs:complexType>
  158. <!-- Constructs from the WS-Addressing SOAP binding -->
  159. <xs:attribute name='IsReferenceParameter' type='xs:boolean'/>
  160. <xs:simpleType name='FaultCodesOpenEnumType'>
  161. <xs:union memberTypes='wsa:FaultCodesType xs:QName'/>
  162. </xs:simpleType>
  163. <xs:simpleType name='FaultCodesType'>
  164. <xs:restriction base='xs:QName'>
  165. <xs:enumeration value='wsa:InvalidAddressingHeader'/>
  166. <xs:enumeration value='wsa:InvalidAddress'/>
  167. <xs:enumeration value='wsa:InvalidEPR'/>
  168. <xs:enumeration value='wsa:InvalidCardinality'/>
  169. <xs:enumeration value='wsa:MissingAddressInEPR'/>
  170. <xs:enumeration value='wsa:DuplicateMessageID'/>
  171. <xs:enumeration value='wsa:ActionMismatch'/>
  172. <xs:enumeration value='wsa:MessageAddressingHeaderRequired'/>
  173. <xs:enumeration value='wsa:DestinationUnreachable'/>
  174. <xs:enumeration value='wsa:ActionNotSupported'/>
  175. <xs:enumeration value='wsa:EndpointUnavailable'/>
  176. </xs:restriction>
  177. </xs:simpleType>
  178. <xs:element name='RetryAfter' type='wsa:AttributedUnsignedLongType'/>
  179. <xs:complexType name='AttributedUnsignedLongType' mixed='false'>
  180. <xs:simpleContent>
  181. <xs:extension base='xs:unsignedLong'>
  182. <xs:anyAttribute namespace='##other' processContents='lax'/>
  183. </xs:extension>
  184. </xs:simpleContent>
  185. </xs:complexType>
  186. <xs:element name='ProblemHeaderQName' type='wsa:AttributedQNameType'/>
  187. <xs:complexType name='AttributedQNameType' mixed='false'>
  188. <xs:simpleContent>
  189. <xs:extension base='xs:QName'>
  190. <xs:anyAttribute namespace='##other' processContents='lax'/>
  191. </xs:extension>
  192. </xs:simpleContent>
  193. </xs:complexType>
  194. <xs:element name='ProblemHeader' type='wsa:AttributedAnyType'/>
  195. <xs:complexType name='AttributedAnyType' mixed='false'>
  196. <xs:sequence>
  197. <xs:any namespace='##any' processContents='lax' minOccurs='1' maxOccurs='1'/>
  198. </xs:sequence>
  199. <xs:anyAttribute namespace='##other' processContents='lax'/>
  200. </xs:complexType>
  201. <xs:element name='ProblemIRI' type='wsa:AttributedURIType'/>
  202. <xs:element name='ProblemAction' type='wsa:ProblemActionType'/>
  203. <xs:complexType name='ProblemActionType' mixed='false'>
  204. <xs:sequence>
  205. <xs:element ref='wsa:Action' minOccurs='0'/>
  206. <xs:element name='SoapAction' minOccurs='0' type='xs:anyURI'/>
  207. </xs:sequence>
  208. <xs:anyAttribute namespace='##other' processContents='lax'/>
  209. </xs:complexType>
  210. </xs:schema>";
  211. }
  212. }