Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / MessageEncodingBindingElementImporter.cs / 1 / MessageEncodingBindingElementImporter.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Channels { using System.Xml; using System.ServiceModel.Description; using System.Xml.Schema; using System.Collections.ObjectModel; using System.Collections.Generic; using System.Text; using System.Web.Services.Description; using WsdlNS = System.Web.Services.Description; public class MessageEncodingBindingElementImporter : IWsdlImportExtension, IPolicyImportExtension { void IWsdlImportExtension.BeforeImport(WsdlNS.ServiceDescriptionCollection wsdlDocuments, XmlSchemaSet xmlSchemas, ICollectionpolicy) { } void IWsdlImportExtension.ImportContract(WsdlImporter importer, WsdlContractConversionContext context) { } void IWsdlImportExtension.ImportEndpoint(WsdlImporter importer, WsdlEndpointConversionContext context) { if (context == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context"); } #pragma warning suppress 56506 // [....], these properties cannot be null in this context if (context.Endpoint.Binding == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context.Endpoint.Binding"); } BindingElementCollection bindingElements = GetBindingElements(context); MessageEncodingBindingElement messageEncodingBindingElement = bindingElements.Find (); TextMessageEncodingBindingElement textEncodingBindingElement = messageEncodingBindingElement as TextMessageEncodingBindingElement; if(messageEncodingBindingElement != null) { Type elementType = messageEncodingBindingElement.GetType(); if (elementType != typeof(TextMessageEncodingBindingElement) && elementType != typeof(BinaryMessageEncodingBindingElement) && elementType != typeof(MtomMessageEncodingBindingElement)) return; } EnsureMessageEncoding(context, messageEncodingBindingElement); foreach (WsdlNS.OperationBinding wsdlOperationBinding in context.WsdlBinding.Operations) { OperationDescription operation = context.GetOperationDescription(wsdlOperationBinding); for (int i = 0; i < operation.Messages.Count; i++) { MessageDescription message = operation.Messages[i]; WsdlNS.MessageBinding wsdlMessageBinding = context.GetMessageBinding(message); ImportMessageSoapAction(context.ContractConversionContext, message, wsdlMessageBinding, i != 0 /*isResponse*/); } foreach (FaultDescription fault in operation.Faults) { WsdlNS.FaultBinding wsdlFaultBinding = context.GetFaultBinding(fault); if (wsdlFaultBinding != null) { ImportFaultSoapAction(context.ContractConversionContext, fault, wsdlFaultBinding); } } } } static void ImportFaultSoapAction(WsdlContractConversionContext contractContext, FaultDescription fault, WsdlNS.FaultBinding wsdlFaultBinding) { string soapAction = SoapHelper.ReadSoapAction(wsdlFaultBinding.OperationBinding); if (contractContext != null) { WsdlNS.OperationFault wsdlOperationFault = contractContext.GetOperationFault(fault); string wsaAction = WsdlImporter.WSAddressingHelper.FindWsaActionAttribute(wsdlOperationFault); if (wsaAction == null && soapAction != null) fault.Action = soapAction; // } else { // } } static void ImportMessageSoapAction(WsdlContractConversionContext contractContext, MessageDescription message, WsdlNS.MessageBinding wsdlMessageBinding, bool isResponse) { string soapAction = SoapHelper.ReadSoapAction(wsdlMessageBinding.OperationBinding); if (contractContext != null) { WsdlNS.OperationMessage wsdlOperationMessage = contractContext.GetOperationMessage(message); string wsaAction = WsdlImporter.WSAddressingHelper.FindWsaActionAttribute(wsdlOperationMessage); if (wsaAction == null && soapAction != null) { if (isResponse) { message.Action = "*"; } else { message.Action = soapAction; } } // } else { // } } static void EnsureMessageEncoding(WsdlEndpointConversionContext context, MessageEncodingBindingElement encodingBindingElement) { EnvelopeVersion soapVersion = SoapHelper.GetSoapVersion(context.WsdlBinding); AddressingVersion addressingVersion; if (encodingBindingElement == null) { encodingBindingElement = new TextMessageEncodingBindingElement(); ConvertToCustomBinding(context).Elements.Add(encodingBindingElement); addressingVersion = AddressingVersion.None; } else { if (soapVersion == EnvelopeVersion.None) addressingVersion = AddressingVersion.None; else addressingVersion = encodingBindingElement.MessageVersion.Addressing; } MessageVersion newMessageVersion = MessageVersion.CreateVersion(soapVersion, addressingVersion); if (!encodingBindingElement.MessageVersion.IsMatch(newMessageVersion)) { ConvertToCustomBinding(context).Elements.Find ().MessageVersion = MessageVersion.CreateVersion(soapVersion, addressingVersion); } } static BindingElementCollection GetBindingElements(WsdlEndpointConversionContext context) { Binding binding = context.Endpoint.Binding; BindingElementCollection elements = binding is CustomBinding ? ((CustomBinding)binding).Elements : binding.CreateBindingElements(); return elements; } static CustomBinding ConvertToCustomBinding(WsdlEndpointConversionContext context) { CustomBinding customBinding = context.Endpoint.Binding as CustomBinding; if (customBinding == null) { customBinding = new CustomBinding(context.Endpoint.Binding); context.Endpoint.Binding = customBinding; } return customBinding; } void IPolicyImportExtension.ImportPolicy(MetadataImporter importer, PolicyConversionContext context) { if (importer == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("importer"); } if (context == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context"); } ImportPolicyInternal(context); } void ImportPolicyInternal(PolicyConversionContext context) { ICollection assertions = context.GetBindingAssertions(); XmlElement encodingAssertion; MessageEncodingBindingElement encodingBindingElement; encodingBindingElement = CreateEncodingBindingElement(context.GetBindingAssertions(), out encodingAssertion); AddressingVersion addressingVersion = WsdlImporter.WSAddressingHelper.FindAddressingVersion(context); ApplyAddressingVersion(encodingBindingElement, addressingVersion); #pragma warning suppress 56506 context.BindingElements.Add(encodingBindingElement); } static void ApplyAddressingVersion(MessageEncodingBindingElement encodingBindingElement, AddressingVersion addressingVersion) { EnvelopeVersion defaultEnvelopeVersion = encodingBindingElement.MessageVersion.Envelope; if (defaultEnvelopeVersion == EnvelopeVersion.None && addressingVersion != AddressingVersion.None) { // The default envelope version is None which incompatible with the // addressing version. // We replace it with soap12. This will be updated at wsdl import time if necessary. encodingBindingElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, addressingVersion); } else { encodingBindingElement.MessageVersion = MessageVersion.CreateVersion(defaultEnvelopeVersion, addressingVersion); } } MessageEncodingBindingElement CreateEncodingBindingElement(ICollection assertions, out XmlElement encodingAssertion) { encodingAssertion = null; foreach (XmlElement assertion in assertions) { switch (assertion.NamespaceURI) { case MessageEncodingPolicyConstants.BinaryEncodingNamespace: if (assertion.LocalName == MessageEncodingPolicyConstants.BinaryEncodingName) { encodingAssertion = assertion; assertions.Remove(encodingAssertion); return new BinaryMessageEncodingBindingElement(); } break; case MessageEncodingPolicyConstants.OptimizedMimeSerializationNamespace: if (assertion.LocalName == MessageEncodingPolicyConstants.MtomEncodingName) { encodingAssertion = assertion; assertions.Remove(encodingAssertion); return new MtomMessageEncodingBindingElement(); } break; } } return new TextMessageEncodingBindingElement(); } } static class MessageEncodingPolicyConstants { public const string BinaryEncodingName = "BinaryEncoding"; public const string BinaryEncodingNamespace = "http://schemas.microsoft.com/ws/06/2004/mspolicy/netbinary1"; public const string BinaryEncodingPrefix = "msb"; public const string OptimizedMimeSerializationNamespace = "http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization"; public const string OptimizedMimeSerializationPrefix = "wsoma"; public const string MtomEncodingName = "OptimizedMimeSerialization"; } } // 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
- XmlParser.cs
- ServicePointManagerElement.cs
- SqlInternalConnectionSmi.cs
- WCFServiceClientProxyGenerator.cs
- ExcludeFromCodeCoverageAttribute.cs
- XsdDuration.cs
- BitConverter.cs
- TraceXPathNavigator.cs
- HGlobalSafeHandle.cs
- XmlAutoDetectWriter.cs
- HtmlWindowCollection.cs
- RightNameExpirationInfoPair.cs
- DelegateSerializationHolder.cs
- UriWriter.cs
- AggregateException.cs
- DataGridViewSelectedColumnCollection.cs
- XmlDataSource.cs
- SecurityChannelListener.cs
- XPathNavigator.cs
- SafeRightsManagementHandle.cs
- Color.cs
- SectionUpdates.cs
- RoutedEventHandlerInfo.cs
- DefaultValueMapping.cs
- ResXBuildProvider.cs
- ContentElement.cs
- XsltException.cs
- ComponentChangedEvent.cs
- XmlQueryOutput.cs
- TypeDescriptionProvider.cs
- RadioButtonList.cs
- SplitContainer.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- KeyEventArgs.cs
- QilParameter.cs
- CallSiteBinder.cs
- ScriptControl.cs
- SingleStorage.cs
- FileUpload.cs
- DataControlFieldCollection.cs
- ConstraintManager.cs
- ProfileGroupSettingsCollection.cs
- RuntimeCompatibilityAttribute.cs
- indexingfiltermarshaler.cs
- DNS.cs
- MeshGeometry3D.cs
- MonthCalendar.cs
- DataSourceBooleanViewSchemaConverter.cs
- SourceFileInfo.cs
- WebPartDeleteVerb.cs
- UnitySerializationHolder.cs
- AttachInfo.cs
- EmptyEnumerable.cs
- DesignerListAdapter.cs
- TextDecorationUnitValidation.cs
- SplayTreeNode.cs
- OutputCacheSection.cs
- WebPartsPersonalization.cs
- SelectionService.cs
- StrokeDescriptor.cs
- Size.cs
- RegexWorker.cs
- System.Data.OracleClient_BID.cs
- GZipStream.cs
- BamlResourceSerializer.cs
- ForceCopyBuildProvider.cs
- AsyncPostBackErrorEventArgs.cs
- DesignTimeXamlWriter.cs
- PasswordTextNavigator.cs
- RegexMatchCollection.cs
- XmlRootAttribute.cs
- TemplateBindingExpressionConverter.cs
- TreeBuilder.cs
- SecurityDocument.cs
- WindowsRichEdit.cs
- PerformanceCounterPermission.cs
- TakeQueryOptionExpression.cs
- CursorConverter.cs
- TextElementEnumerator.cs
- SimpleBitVector32.cs
- DataSourceView.cs
- ReaderOutput.cs
- ImageSourceValueSerializer.cs
- HostSecurityManager.cs
- URLIdentityPermission.cs
- OlePropertyStructs.cs
- Message.cs
- ServiceContractGenerator.cs
- EncoderExceptionFallback.cs
- PropertyBuilder.cs
- UserMapPath.cs
- ComponentEvent.cs
- DataKeyArray.cs
- WindowsUpDown.cs
- StrokeCollection2.cs
- ContourSegment.cs
- MediaEntryAttribute.cs
- CngAlgorithmGroup.cs
- SkewTransform.cs
- ACL.cs