EndpointAddressAugust2004.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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 = Addressing200408Strings.Namespace)]
  16. public class EndpointAddressAugust2004 : IXmlSerializable
  17. {
  18. static XmlQualifiedName eprType;
  19. EndpointAddress address;
  20. // for IXmlSerializable
  21. EndpointAddressAugust2004()
  22. {
  23. this.address = null;
  24. }
  25. EndpointAddressAugust2004(EndpointAddress address)
  26. {
  27. this.address = address;
  28. }
  29. public static EndpointAddressAugust2004 FromEndpointAddress(EndpointAddress address)
  30. {
  31. if (address == null)
  32. {
  33. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
  34. }
  35. return new EndpointAddressAugust2004(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.WSAddressingAugust2004, XmlDictionaryReader.CreateDictionaryReader(reader));
  44. }
  45. void IXmlSerializable.WriteXml(XmlWriter writer)
  46. {
  47. this.address.WriteContentsTo(AddressingVersion.WSAddressingAugust2004, XmlDictionaryWriter.CreateDictionaryWriter(writer));
  48. }
  49. static XmlQualifiedName EprType
  50. {
  51. get
  52. {
  53. if (eprType == null)
  54. eprType = new XmlQualifiedName(AddressingStrings.EndpointReferenceType, Addressing200408Strings.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(Addressing200408Strings.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 targetNamespace=""http://schemas.xmlsoap.org/ws/2004/08/addressing"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:wsa=""http://schemas.xmlsoap.org/ws/2004/08/addressing"" elementFormDefault=""qualified"" blockDefault=""#all"">
  104. <!-- //////////////////// WS-Addressing //////////////////// -->
  105. <!-- Endpoint reference -->
  106. <xs:element name=""EndpointReference"" type=""wsa:EndpointReferenceType""/>
  107. <xs:complexType name=""EndpointReferenceType"">
  108. <xs:sequence>
  109. <xs:element name=""Address"" type=""wsa:AttributedURI""/>
  110. <xs:element name=""ReferenceProperties"" type=""wsa:ReferencePropertiesType"" minOccurs=""0""/>
  111. <xs:element name=""ReferenceParameters"" type=""wsa:ReferenceParametersType"" minOccurs=""0""/>
  112. <xs:element name=""PortType"" type=""wsa:AttributedQName"" minOccurs=""0""/>
  113. <xs:element name=""ServiceName"" type=""wsa:ServiceNameType"" minOccurs=""0""/>
  114. <xs:any namespace=""##other"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded"">
  115. <xs:annotation>
  116. <xs:documentation>
  117. If ""Policy"" elements from namespace ""http://schemas.xmlsoap.org/ws/2002/12/policy#policy"" are used, they must appear first (before any extensibility elements).
  118. </xs:documentation>
  119. </xs:annotation>
  120. </xs:any>
  121. </xs:sequence>
  122. <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
  123. </xs:complexType>
  124. <xs:complexType name=""ReferencePropertiesType"">
  125. <xs:sequence>
  126. <xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
  127. </xs:sequence>
  128. </xs:complexType>
  129. <xs:complexType name=""ReferenceParametersType"">
  130. <xs:sequence>
  131. <xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
  132. </xs:sequence>
  133. </xs:complexType>
  134. <xs:complexType name=""ServiceNameType"">
  135. <xs:simpleContent>
  136. <xs:extension base=""xs:QName"">
  137. <xs:attribute name=""PortName"" type=""xs:NCName""/>
  138. <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
  139. </xs:extension>
  140. </xs:simpleContent>
  141. </xs:complexType>
  142. <!-- Message information header blocks -->
  143. <xs:element name=""MessageID"" type=""wsa:AttributedURI""/>
  144. <xs:element name=""RelatesTo"" type=""wsa:Relationship""/>
  145. <xs:element name=""To"" type=""wsa:AttributedURI""/>
  146. <xs:element name=""Action"" type=""wsa:AttributedURI""/>
  147. <xs:element name=""From"" type=""wsa:EndpointReferenceType""/>
  148. <xs:element name=""ReplyTo"" type=""wsa:EndpointReferenceType""/>
  149. <xs:element name=""FaultTo"" type=""wsa:EndpointReferenceType""/>
  150. <xs:complexType name=""Relationship"">
  151. <xs:simpleContent>
  152. <xs:extension base=""xs:anyURI"">
  153. <xs:attribute name=""RelationshipType"" type=""xs:QName"" use=""optional""/>
  154. <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
  155. </xs:extension>
  156. </xs:simpleContent>
  157. </xs:complexType>
  158. <xs:simpleType name=""RelationshipTypeValues"">
  159. <xs:restriction base=""xs:QName"">
  160. <xs:enumeration value=""wsa:Reply""/>
  161. </xs:restriction>
  162. </xs:simpleType>
  163. <xs:element name=""ReplyAfter"" type=""wsa:ReplyAfterType""/>
  164. <xs:complexType name=""ReplyAfterType"">
  165. <xs:simpleContent>
  166. <xs:extension base=""xs:nonNegativeInteger"">
  167. <xs:anyAttribute namespace=""##other""/>
  168. </xs:extension>
  169. </xs:simpleContent>
  170. </xs:complexType>
  171. <xs:simpleType name=""FaultSubcodeValues"">
  172. <xs:restriction base=""xs:QName"">
  173. <xs:enumeration value=""wsa:InvalidMessageInformationHeader""/>
  174. <xs:enumeration value=""wsa:MessageInformationHeaderRequired""/>
  175. <xs:enumeration value=""wsa:DestinationUnreachable""/>
  176. <xs:enumeration value=""wsa:ActionNotSupported""/>
  177. <xs:enumeration value=""wsa:EndpointUnavailable""/>
  178. </xs:restriction>
  179. </xs:simpleType>
  180. <xs:attribute name=""Action"" type=""xs:anyURI""/>
  181. <!-- Common declarations and definitions -->
  182. <xs:complexType name=""AttributedQName"">
  183. <xs:simpleContent>
  184. <xs:extension base=""xs:QName"">
  185. <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
  186. </xs:extension>
  187. </xs:simpleContent>
  188. </xs:complexType>
  189. <xs:complexType name=""AttributedURI"">
  190. <xs:simpleContent>
  191. <xs:extension base=""xs:anyURI"">
  192. <xs:anyAttribute namespace=""##other"" processContents=""lax""/>
  193. </xs:extension>
  194. </xs:simpleContent>
  195. </xs:complexType>
  196. </xs:schema>";
  197. }
  198. }