|
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.ServiceModel
{
using System;
using System.ServiceModel.Channels;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Collections;
using System.Text;
using System.IO;
[XmlSchemaProvider("GetSchema")]
[XmlRoot(AddressingStrings.EndpointReference, Namespace = Addressing200408Strings.Namespace)]
public class EndpointAddressAugust2004 : IXmlSerializable
{
static XmlQualifiedName eprType;
EndpointAddress address;
// for IXmlSerializable
EndpointAddressAugust2004()
{
this.address = null;
}
EndpointAddressAugust2004(EndpointAddress address)
{
this.address = address;
}
public static EndpointAddressAugust2004 FromEndpointAddress(EndpointAddress address)
{
if (address == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
}
return new EndpointAddressAugust2004(address);
}
public EndpointAddress ToEndpointAddress()
{
return this.address;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
this.address = EndpointAddress.ReadFrom(AddressingVersion.WSAddressingAugust2004, XmlDictionaryReader.CreateDictionaryReader(reader));
}
void IXmlSerializable.WriteXml(XmlWriter writer)
{
this.address.WriteContentsTo(AddressingVersion.WSAddressingAugust2004, XmlDictionaryWriter.CreateDictionaryWriter(writer));
}
static XmlQualifiedName EprType
{
get
{
if (eprType == null)
eprType = new XmlQualifiedName(AddressingStrings.EndpointReferenceType, Addressing200408Strings.Namespace);
return eprType;
}
}
static XmlSchema GetEprSchema()
{
using (XmlTextReader reader = new XmlTextReader(new StringReader(Schema)) { DtdProcessing = DtdProcessing.Prohibit })
{
return XmlSchema.Read(reader, null);
}
}
public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
{
if (xmlSchemaSet == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlSchemaSet");
XmlQualifiedName eprType = EprType;
XmlSchema eprSchema = GetEprSchema();
ICollection schemas = xmlSchemaSet.Schemas(Addressing200408Strings.Namespace);
if (schemas == null || schemas.Count == 0)
xmlSchemaSet.Add(eprSchema);
else
{
XmlSchema schemaToAdd = null;
foreach (XmlSchema xmlSchema in schemas)
{
if (xmlSchema.SchemaTypes.Contains(eprType))
{
schemaToAdd = null;
break;
}
else
schemaToAdd = xmlSchema;
}
if (schemaToAdd != null)
{
foreach (XmlQualifiedName prefixNsPair in eprSchema.Namespaces.ToArray())
schemaToAdd.Namespaces.Add(prefixNsPair.Name, prefixNsPair.Namespace);
foreach (XmlSchemaObject schemaObject in eprSchema.Items)
schemaToAdd.Items.Add(schemaObject);
xmlSchemaSet.Reprocess(schemaToAdd);
}
}
return eprType;
}
XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
const string Schema =
@"<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"">
<!-- //////////////////// WS-Addressing //////////////////// -->
<!-- Endpoint reference -->
<xs:element name=""EndpointReference"" type=""wsa:EndpointReferenceType""/>
<xs:complexType name=""EndpointReferenceType"">
<xs:sequence>
<xs:element name=""Address"" type=""wsa:AttributedURI""/>
<xs:element name=""ReferenceProperties"" type=""wsa:ReferencePropertiesType"" minOccurs=""0""/>
<xs:element name=""ReferenceParameters"" type=""wsa:ReferenceParametersType"" minOccurs=""0""/>
<xs:element name=""PortType"" type=""wsa:AttributedQName"" minOccurs=""0""/>
<xs:element name=""ServiceName"" type=""wsa:ServiceNameType"" minOccurs=""0""/>
<xs:any namespace=""##other"" processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded"">
<xs:annotation>
<xs:documentation>
If ""Policy"" elements from namespace ""http://schemas.xmlsoap.org/ws/2002/12/policy#policy"" are used, they must appear first (before any extensibility elements).
</xs:documentation>
</xs:annotation>
</xs:any>
</xs:sequence>
<xs:anyAttribute namespace=""##other"" processContents=""lax""/>
</xs:complexType>
<xs:complexType name=""ReferencePropertiesType"">
<xs:sequence>
<xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=""ReferenceParametersType"">
<xs:sequence>
<xs:any processContents=""lax"" minOccurs=""0"" maxOccurs=""unbounded""/>
</xs:sequence>
</xs:complexType>
<xs:complexType name=""ServiceNameType"">
<xs:simpleContent>
<xs:extension base=""xs:QName"">
<xs:attribute name=""PortName"" type=""xs:NCName""/>
<xs:anyAttribute namespace=""##other"" processContents=""lax""/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Message information header blocks -->
<xs:element name=""MessageID"" type=""wsa:AttributedURI""/>
<xs:element name=""RelatesTo"" type=""wsa:Relationship""/>
<xs:element name=""To"" type=""wsa:AttributedURI""/>
<xs:element name=""Action"" type=""wsa:AttributedURI""/>
<xs:element name=""From"" type=""wsa:EndpointReferenceType""/>
<xs:element name=""ReplyTo"" type=""wsa:EndpointReferenceType""/>
<xs:element name=""FaultTo"" type=""wsa:EndpointReferenceType""/>
<xs:complexType name=""Relationship"">
<xs:simpleContent>
<xs:extension base=""xs:anyURI"">
<xs:attribute name=""RelationshipType"" type=""xs:QName"" use=""optional""/>
<xs:anyAttribute namespace=""##other"" processContents=""lax""/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name=""RelationshipTypeValues"">
<xs:restriction base=""xs:QName"">
<xs:enumeration value=""wsa:Reply""/>
</xs:restriction>
</xs:simpleType>
<xs:element name=""ReplyAfter"" type=""wsa:ReplyAfterType""/>
<xs:complexType name=""ReplyAfterType"">
<xs:simpleContent>
<xs:extension base=""xs:nonNegativeInteger"">
<xs:anyAttribute namespace=""##other""/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name=""FaultSubcodeValues"">
<xs:restriction base=""xs:QName"">
<xs:enumeration value=""wsa:InvalidMessageInformationHeader""/>
<xs:enumeration value=""wsa:MessageInformationHeaderRequired""/>
<xs:enumeration value=""wsa:DestinationUnreachable""/>
<xs:enumeration value=""wsa:ActionNotSupported""/>
<xs:enumeration value=""wsa:EndpointUnavailable""/>
</xs:restriction>
</xs:simpleType>
<xs:attribute name=""Action"" type=""xs:anyURI""/>
<!-- Common declarations and definitions -->
<xs:complexType name=""AttributedQName"">
<xs:simpleContent>
<xs:extension base=""xs:QName"">
<xs:anyAttribute namespace=""##other"" processContents=""lax""/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name=""AttributedURI"">
<xs:simpleContent>
<xs:extension base=""xs:anyURI"">
<xs:anyAttribute namespace=""##other"" processContents=""lax""/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>";
}
}
|