Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / AddressHeader.cs / 1 / AddressHeader.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Collections.Generic; using System.ServiceModel; using System.ServiceModel.Dispatcher; using System.Diagnostics; using System.Runtime.Serialization; using System.Text; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; public abstract class AddressHeader { ParameterHeader header; protected AddressHeader() { } internal bool IsReferenceProperty { get { BufferedAddressHeader bah = this as BufferedAddressHeader; return bah != null && bah.IsReferencePropertyHeader; } } public abstract string Name { get; } public abstract string Namespace { get; } public static AddressHeader CreateAddressHeader(object value) { Type type = GetObjectType(value); return CreateAddressHeader(value, DataContractSerializerDefaults.CreateSerializer(type, int.MaxValue/*maxItems*/)); } public static AddressHeader CreateAddressHeader(object value, XmlObjectSerializer serializer) { if (serializer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("serializer")); return new XmlObjectSerializerAddressHeader(value, serializer); } public static AddressHeader CreateAddressHeader(string name, string ns, object value) { return CreateAddressHeader(name, ns, value, DataContractSerializerDefaults.CreateSerializer(GetObjectType(value), name, ns, int.MaxValue/*maxItems*/)); } internal static AddressHeader CreateAddressHeader(XmlDictionaryString name, XmlDictionaryString ns, object value) { return new DictionaryAddressHeader(name, ns, value); } public static AddressHeader CreateAddressHeader(string name, string ns, object value, XmlObjectSerializer serializer) { if (serializer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("serializer")); return new XmlObjectSerializerAddressHeader(name, ns, value, serializer); } static Type GetObjectType(object value) { return (value == null) ? typeof(object) : value.GetType(); } public override bool Equals(object obj) { AddressHeader hdr = obj as AddressHeader; if (hdr == null) return false; StringBuilder builder = new StringBuilder(); string hdr1 = GetComparableForm(builder); builder.Remove(0, builder.Length); string hdr2 = hdr.GetComparableForm(builder); if (hdr1.Length != hdr2.Length) return false; if (string.CompareOrdinal(hdr1, hdr2) != 0) return false; return true; } internal string GetComparableForm() { return GetComparableForm(new StringBuilder()); } internal string GetComparableForm(StringBuilder builder) { return EndpointAddressProcessor.GetComparableForm(builder, GetComparableReader()); } public override int GetHashCode() { return GetComparableForm().GetHashCode(); } public T GetValue() { return GetValue (DataContractSerializerDefaults.CreateSerializer(typeof(T), this.Name, this.Namespace, int.MaxValue/*maxItems*/)); } public T GetValue (XmlObjectSerializer serializer) { if (serializer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("serializer")); using (XmlDictionaryReader reader = GetAddressHeaderReader()) { if (serializer.IsStartObject(reader)) return (T)serializer.ReadObject(reader); else throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SR.GetString(SR.ExpectedElementMissing, Name, Namespace))); } } public virtual XmlDictionaryReader GetAddressHeaderReader() { XmlBuffer buffer = new XmlBuffer(int.MaxValue); XmlDictionaryWriter writer = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); WriteAddressHeader(writer); buffer.CloseSection(); buffer.Close(); return buffer.GetReader(0); } XmlDictionaryReader GetComparableReader() { XmlBuffer buffer = new XmlBuffer(int.MaxValue); XmlDictionaryWriter writer = buffer.OpenSection(XmlDictionaryReaderQuotas.Max); // WSAddressingAugust2004 does not write the IsReferenceParameter attribute, // and that's good for a consistent comparable form ParameterHeader.WriteStartHeader(writer, this, AddressingVersion.WSAddressingAugust2004); ParameterHeader.WriteHeaderContents(writer, this); writer.WriteEndElement(); buffer.CloseSection(); buffer.Close(); return buffer.GetReader(0); } protected virtual void OnWriteStartAddressHeader(XmlDictionaryWriter writer) { writer.WriteStartElement(Name, Namespace); } protected abstract void OnWriteAddressHeaderContents(XmlDictionaryWriter writer); public MessageHeader ToMessageHeader() { if (header == null) header = new ParameterHeader(this); return header; } public void WriteAddressHeader(XmlWriter writer) { WriteAddressHeader(XmlDictionaryWriter.CreateDictionaryWriter(writer)); } public void WriteAddressHeader(XmlDictionaryWriter writer) { if (writer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("writer")); WriteStartAddressHeader(writer); WriteAddressHeaderContents(writer); writer.WriteEndElement(); } public void WriteStartAddressHeader(XmlDictionaryWriter writer) { if (writer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("writer")); OnWriteStartAddressHeader(writer); } public void WriteAddressHeaderContents(XmlDictionaryWriter writer) { if (writer == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("writer")); OnWriteAddressHeaderContents(writer); } class ParameterHeader : MessageHeader { AddressHeader parameter; public override bool IsReferenceParameter { get { return true; } } public override string Name { get { return parameter.Name; } } public override string Namespace { get { return parameter.Namespace; } } public ParameterHeader(AddressHeader parameter) { this.parameter = parameter; } protected override void OnWriteStartHeader(XmlDictionaryWriter writer, MessageVersion messageVersion) { if (messageVersion == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("messageVersion")); WriteStartHeader(writer, parameter, messageVersion.Addressing); } protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) { WriteHeaderContents(writer, parameter); } internal static void WriteStartHeader(XmlDictionaryWriter writer, AddressHeader parameter, AddressingVersion addressingVersion) { parameter.WriteStartAddressHeader(writer); if (addressingVersion == AddressingVersion.WSAddressing10) { writer.WriteAttributeString(XD.AddressingDictionary.IsReferenceParameter, XD.Addressing10Dictionary.Namespace, "true"); } } internal static void WriteHeaderContents(XmlDictionaryWriter writer, AddressHeader parameter) { parameter.WriteAddressHeaderContents(writer); } } class XmlObjectSerializerAddressHeader : AddressHeader { XmlObjectSerializer serializer; object objectToSerialize; string name; string ns; public XmlObjectSerializerAddressHeader(object objectToSerialize, XmlObjectSerializer serializer) { this.serializer = serializer; this.objectToSerialize = objectToSerialize; Type type = (objectToSerialize == null) ? typeof(object) : objectToSerialize.GetType(); XmlQualifiedName rootName = new XsdDataContractExporter().GetRootElementName(type); this.name = rootName.Name; this.ns = rootName.Namespace; } public XmlObjectSerializerAddressHeader(string name, string ns, object objectToSerialize, XmlObjectSerializer serializer) { if ((null == name) || (name.Length == 0)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("name")); } this.serializer = serializer; this.objectToSerialize = objectToSerialize; this.name = name; this.ns = ns; } public override string Name { get { return name; } } public override string Namespace { get { return ns; } } object ThisLock { get { return this; } } protected override void OnWriteAddressHeaderContents(XmlDictionaryWriter writer) { lock (ThisLock) { serializer.WriteObjectContent(writer, objectToSerialize); } } } // [....], This will be kept internal for now. If the optimization needs to be public, we'll re-evaluate it. class DictionaryAddressHeader : XmlObjectSerializerAddressHeader { XmlDictionaryString name; XmlDictionaryString ns; public DictionaryAddressHeader(XmlDictionaryString name, XmlDictionaryString ns, object value) : base(name.Value, ns.Value, value, DataContractSerializerDefaults.CreateSerializer(GetObjectType(value), name, ns, int.MaxValue/*maxItems*/)) { this.name = name; this.ns = ns; } protected override void OnWriteStartAddressHeader(XmlDictionaryWriter writer) { writer.WriteStartElement(name, ns); } } } class BufferedAddressHeader : AddressHeader { string name; string ns; XmlBuffer buffer; bool isReferenceProperty; public BufferedAddressHeader(XmlDictionaryReader reader) { buffer = new XmlBuffer(int.MaxValue); XmlDictionaryWriter writer = buffer.OpenSection(reader.Quotas); DiagnosticUtility.DebugAssert(reader.NodeType == XmlNodeType.Element, ""); name = reader.LocalName; ns = reader.NamespaceURI; DiagnosticUtility.DebugAssert(name != null, ""); DiagnosticUtility.DebugAssert(ns != null, ""); writer.WriteNode(reader, false); buffer.CloseSection(); buffer.Close(); this.isReferenceProperty = false; } public BufferedAddressHeader(XmlDictionaryReader reader, bool isReferenceProperty) : this(reader) { this.isReferenceProperty = isReferenceProperty; } public bool IsReferencePropertyHeader { get { return this.isReferenceProperty; } } public override string Name { get { return name; } } public override string Namespace { get { return ns; } } public override XmlDictionaryReader GetAddressHeaderReader() { return buffer.GetReader(0); } protected override void OnWriteStartAddressHeader(XmlDictionaryWriter writer) { XmlDictionaryReader reader = GetAddressHeaderReader(); writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI); writer.WriteAttributes(reader, false); reader.Close(); } protected override void OnWriteAddressHeaderContents(XmlDictionaryWriter writer) { XmlDictionaryReader reader = GetAddressHeaderReader(); reader.ReadStartElement(); while (reader.NodeType != XmlNodeType.EndElement) writer.WriteNode(reader, false); reader.ReadEndElement(); reader.Close(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XPathScanner.cs
- EntityDataSourceState.cs
- InvokeBinder.cs
- DescendantOverDescendantQuery.cs
- CodeIdentifier.cs
- MarshalDirectiveException.cs
- Int32CAMarshaler.cs
- XhtmlTextWriter.cs
- ManagementClass.cs
- FontFamily.cs
- ApplicationException.cs
- PipeStream.cs
- RSACryptoServiceProvider.cs
- SymLanguageVendor.cs
- CommandConverter.cs
- _LazyAsyncResult.cs
- DataControlFieldCollection.cs
- _CommandStream.cs
- _TransmitFileOverlappedAsyncResult.cs
- BookmarkScopeManager.cs
- exports.cs
- ColorAnimationBase.cs
- ExtendedPropertyCollection.cs
- WebUtil.cs
- TPLETWProvider.cs
- ReceiveMessageContent.cs
- DoubleCollectionConverter.cs
- DetailsViewModeEventArgs.cs
- SerializationInfoEnumerator.cs
- CqlGenerator.cs
- OleDbSchemaGuid.cs
- AsyncCompletedEventArgs.cs
- InvokeMemberBinder.cs
- PublisherMembershipCondition.cs
- MimeObjectFactory.cs
- PhysicalOps.cs
- HttpResponse.cs
- IndexOutOfRangeException.cs
- AsyncCompletedEventArgs.cs
- TriggerActionCollection.cs
- ObjectDataSource.cs
- FormClosingEvent.cs
- HeaderedContentControl.cs
- TimeSpanValidator.cs
- SqlMetaData.cs
- FormViewUpdatedEventArgs.cs
- EmptyQuery.cs
- HttpListenerRequest.cs
- HelloOperation11AsyncResult.cs
- EventProperty.cs
- SQLByte.cs
- GridLength.cs
- EntityContainerRelationshipSetEnd.cs
- StateInitializationDesigner.cs
- GeometryConverter.cs
- EntryWrittenEventArgs.cs
- PagesChangedEventArgs.cs
- _ChunkParse.cs
- TextModifier.cs
- EventSinkActivity.cs
- QueryResponse.cs
- EntityViewContainer.cs
- CompositeScriptReference.cs
- BinHexEncoder.cs
- RequestCachingSection.cs
- SchemaImporterExtensionElementCollection.cs
- GridViewCommandEventArgs.cs
- WebPartMenuStyle.cs
- FormViewDeleteEventArgs.cs
- AuthenticationSection.cs
- EnumValAlphaComparer.cs
- FixUpCollection.cs
- SqlDataSourceEnumerator.cs
- HtmlTableCell.cs
- UniqueConstraint.cs
- PointCollectionConverter.cs
- XmlQueryContext.cs
- XMLDiffLoader.cs
- SafeProcessHandle.cs
- WpfXamlLoader.cs
- SoapIncludeAttribute.cs
- FontFamily.cs
- CheckedListBox.cs
- ColorConvertedBitmapExtension.cs
- AnchorEditor.cs
- EntityViewGenerator.cs
- NativeRightsManagementAPIsStructures.cs
- UdpDuplexChannel.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- SqlCrossApplyToCrossJoin.cs
- RoleGroup.cs
- BamlReader.cs
- TreeSet.cs
- MsmqIntegrationSecurity.cs
- ProviderException.cs
- HttpException.cs
- MinMaxParagraphWidth.cs
- ExtensionFile.cs
- WizardDesigner.cs
- CompositeControl.cs