< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Description.WsdlExporter
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Description/WsdlExporter.cs
Line coverage
62%
Covered lines: 335
Uncovered lines: 199
Coverable lines: 534
Total lines: 1270
Line coverage: 62.7%
Branch coverage
52%
Covered branches: 112
Total branches: 212
Branch coverage: 52.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
Clone()50%101064.28%
ExportContract(...)62.5%161661.29%
ExportEndpoint(...)0%440%
ExportEndpoints(...)100%110%
ExportEndpoints(...)62.5%8866.66%
GetGeneratedMetadata()100%44100%
ExportEndpoint(...)68.18%222273.68%
AddWSAddressingAssertion(...)100%11100%
CallExportEndpoint(...)100%22100%
CallExportContract(...)100%22100%
CreateWsdlPortType(...)50%2290.9%
CreateWsdlOperation(...)100%11100%
CreateWsdlOperationMessage(...)100%44100%
CreateWsdlOperationFault(...)100%110%
CreateWsdlBindingAndPort(...)66.66%6678.57%
AddAddressToWsdlPort(...)100%110%
CreateWsdlOperationBinding(...)100%11100%
CreateWsdlMessageBinding(...)100%44100%
CreateWsdlFaultBinding(...)0%220%
OperationIsExportable(...)100%11100%
OperationIsExportable(...)66.66%6662.5%
IsBuiltInOperationBehavior(...)75%4466.66%
GetOrCreateWsdl(...)100%44100%
GetOrCreateWsdlService(...)100%44100%
EnsureWsdlContainsImport(...)16.66%6614.28%
LogExportWarning(...)100%110%
GetEmptySchemaSet()100%11100%
AddActionAttribute(...)50%2270%
AddAddressToWsdlPort(...)50%6680%
AddWSAddressingAssertion(...)70%101039.28%
.ctor(...)100%11100%
AttachPolicy(...)75%161654.05%
AttachItemPolicy(...)100%11100%
InsertPolicyReference(...)100%11100%
InsertPolicy(...)100%22100%
CreatePolicyElement(...)100%22100%
CreateBindingPolicyKey(...)100%11100%
CreateOperationBindingPolicyKey(...)100%110%
CreateMessageBindingPolicyKey(...)0%220%
CreateFaultBindingPolicyKey(...)0%220%
.ctor(...)100%11100%
.ctor()100%11100%
Add(...)100%22100%
GetNamespaces()100%11100%
FindOrCreatePrefix(...)0%10100%
PrefixExists(...)100%110%
TryMatchNamespace(...)0%220%
GetPortTypeQName(...)100%11100%
GetUniqueName(...)0%660%
GetBindingQName(...)100%11100%
WsdlBindingQNameExistsImpl(System.String,System.Object)100%44100%
WsdlBindingQNameExists(...)100%11100%
GetPortName(...)100%11100%
ServiceContainsPort(...)100%11100%
GetWsdlOperationName(...)100%11100%
AddUsingSessionAttributeIfNeeded(...)50%4437.5%
AddInitiatingTerminatingAttributesIfNeeded(...)50%2250%
AddInitiatingAttribute(...)100%110%
AddTerminatingAttribute(...)100%110%
CloneAndAddToAttributes(...)0%440%
ToValue(...)0%220%
CallExtension(...)0%2242.85%
CallExtension(...)0%2242.85%
ThrowExtensionException(...)100%110%
ThrowExtensionException(...)0%440%
.ctor(...)100%11100%
Equals(...)0%660%
GetHashCode()100%11100%
.ctor(...)100%11100%
Equals(...)0%660%
GetHashCode()100%11100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Description/WsdlExporter.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Collections.Generic;
 6using System.Globalization;
 7using System.IO;
 8using System.Linq;
 9using System.Xml;
 10using System.Xml.Schema;
 11using System.Xml.Serialization;
 12using CoreWCF.Channels;
 13using CoreWCF.Runtime;
 14using WsdlNS = System.Web.Services.Description;
 15
 16namespace CoreWCF.Description
 17{
 18    public class WsdlExporter : MetadataExporter
 19    {
 20        internal const string SessionOpenedAction = "http://schemas.microsoft.com/2011/02/session/onopen";
 21        internal const string DefaultNamespace = "http://tempuri.org/";
 22        internal const string DefaultServiceName = "service";
 23        private static XmlDocument s_xmlDocument;
 24        private bool _isFaulted = false;
 4725        private Dictionary<ContractDescription, WsdlContractConversionContext> _exportedContracts = new Dictionary<Contr
 4726        private Dictionary<BindingDictionaryKey, WsdlEndpointConversionContext> _exportedBindings = new Dictionary<Bindi
 4727        private Dictionary<EndpointDictionaryKey, ServiceEndpoint> _exportedEndpoints = new Dictionary<EndpointDictionar
 28
 29        internal WsdlExporter Clone()
 30        {
 2431            WsdlExporter exporter = new WsdlExporter();
 32
 2433            if (_exportedContracts.Count > 0)
 034                exporter._exportedContracts = new Dictionary<ContractDescription, WsdlContractConversionContext>(_export
 35
 2436            if (_exportedBindings.Count > 0)
 037                exporter._exportedBindings = new Dictionary<BindingDictionaryKey, WsdlEndpointConversionContext>(_export
 38
 2439            if (_exportedEndpoints.Count > 0)
 040                exporter._exportedEndpoints = new Dictionary<EndpointDictionaryKey, ServiceEndpoint>(_exportedEndpoints)
 41
 2442            exporter._isFaulted = _isFaulted;
 43
 44            // Base class clone
 2445            exporter.PolicyVersion = PolicyVersion;
 4846            foreach (var error in Errors)
 047                exporter.Errors.Add(error);
 48
 4849            foreach(var stateItem in State)
 050                exporter.State.Add(stateItem.Key, stateItem.Value);
 51
 2452            return exporter;
 53        }
 54
 55        public override void ExportContract(ContractDescription contract)
 56        {
 3257            if (_isFaulted)
 58            {
 059                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.WsdlExporterI
 60            }
 61
 3262            if (contract == null)
 63            {
 064                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(contract));
 65            }
 66
 3267            if (!_exportedContracts.ContainsKey(contract))
 68            {
 69                try
 70                {
 2471                    WsdlNS.PortType wsdlPortType = CreateWsdlPortType(contract);
 72                    WsdlContractConversionContext contractContext;
 73
 74
 2475                    contractContext = new WsdlContractConversionContext(contract, wsdlPortType);
 76
 28677                    foreach (OperationDescription operation in contract.Operations)
 78                    {
 11979                        if (!OperationIsExportable(operation, out bool isWildcardAction))
 80                        {
 081                            string warningMsg = isWildcardAction ? SR.Format(SR.WarnSkippingOperationWithWildcardAction,
 082                                : SR.Format(SR.WarnSkippingOperationWithSessionOpenNotificationEnabled, "Action", Sessio
 83
 084                            LogExportWarning(warningMsg);
 085                            continue;
 86                        }
 87
 11988                        WsdlNS.Operation wsdlOperation = CreateWsdlOperation(operation, contract);
 11989                        wsdlPortType.Operations.Add(wsdlOperation);
 90
 11991                        contractContext.AddOperation(operation, wsdlOperation);
 92
 71493                        foreach (MessageDescription message in operation.Messages)
 94                        {
 95                            //Create Operation Message
 23896                            WsdlNS.OperationMessage wsdlOperationMessage = CreateWsdlOperationMessage(message);
 23897                            wsdlOperation.Messages.Add(wsdlOperationMessage);
 23898                            contractContext.AddMessage(message, wsdlOperationMessage);
 99                        }
 100
 238101                        foreach (FaultDescription fault in operation.Faults)
 102                        {
 103                            //Create Operation Fault
 0104                            WsdlNS.OperationFault wsdlOperationFault = CreateWsdlOperationFault(fault);
 0105                            wsdlOperation.Faults.Add(wsdlOperationFault);
 0106                            contractContext.AddFault(fault, wsdlOperationFault);
 107                        }
 108                    }
 109
 24110                    CallExportContract(contractContext);
 111
 24112                    _exportedContracts.Add(contract, contractContext);
 24113                }
 0114                catch
 115                {
 0116                    _isFaulted = true;
 0117                    throw;
 118                }
 119            }
 32120        }
 121
 122        public override void ExportEndpoint(ServiceEndpoint endpoint)
 123        {
 0124            if (_isFaulted)
 125            {
 0126                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.WsdlExporterI
 127            }
 128
 0129            if (endpoint == null)
 130            {
 0131                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(endpoint));
 132            }
 133
 0134            ExportEndpoint(endpoint, new XmlQualifiedName(DefaultServiceName, DefaultNamespace), null);
 0135        }
 136
 0137        public void ExportEndpoints(IEnumerable<ServiceEndpoint> endpoints, XmlQualifiedName wsdlServiceQName) => Export
 138
 139        internal void ExportEndpoints(IEnumerable<ServiceEndpoint> endpoints, XmlQualifiedName wsdlServiceQName, Binding
 140        {
 24141            if (_isFaulted)
 142            {
 0143                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.WsdlExporterI
 144            }
 145
 24146            if (endpoints == null)
 147            {
 0148                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(endpoints));
 149            }
 150
 24151            if (wsdlServiceQName == null)
 152            {
 0153                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(wsdlServiceQName));
 154            }
 155
 112156            foreach (ServiceEndpoint endpoint in endpoints)
 157            {
 32158                ExportEndpoint(endpoint, wsdlServiceQName, bindingParameters);
 159            }
 24160        }
 161
 162        public override MetadataSet GetGeneratedMetadata()
 163        {
 24164            MetadataSet set = new MetadataSet();
 165
 96166            foreach (WsdlNS.ServiceDescription wsdl in GeneratedWsdlDocuments)
 167            {
 24168                set.MetadataSections.Add(MetadataSection.CreateFromServiceDescription(wsdl));
 169            }
 170
 190171            foreach (XmlSchema schema in GeneratedXmlSchemas.Schemas())
 172            {
 71173                set.MetadataSections.Add(MetadataSection.CreateFromSchema(schema));
 174            }
 175
 24176            return set;
 177        }
 178
 210179        public WsdlNS.ServiceDescriptionCollection GeneratedWsdlDocuments { get; } = new WsdlNS.ServiceDescriptionCollec
 180
 4676181        public XmlSchemaSet GeneratedXmlSchemas { get; } = GetEmptySchemaSet();
 182
 183        private void ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, BindingParameterCollect
 184        {
 32185            if (endpoint.Binding == null)
 186            {
 0187                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.EndpointsMu
 188            }
 189
 32190            EndpointDictionaryKey endpointKey = new EndpointDictionaryKey(endpoint, wsdlServiceQName);
 191
 192            try
 193            {
 32194                if (_exportedEndpoints.ContainsKey(endpointKey))
 195                {
 0196                    return;
 197                }
 198
 32199                ExportContract(endpoint.Contract);
 200
 201                // Retreive Conversion Context for Contract;
 202                // Note: Contract must have already been exported at this point.
 32203                WsdlContractConversionContext contractContext = _exportedContracts[endpoint.Contract];
 204
 205
 206                WsdlNS.Binding wsdlBinding;
 32207                wsdlBinding = CreateWsdlBindingAndPort(endpoint, wsdlServiceQName, out WsdlNS.Port wsdlPort, out bool ne
 208
 209
 32210                if (!newWsdlBinding && wsdlPort == null)
 211                {
 0212                    return;
 213                }
 214
 215                // Create an Endpoint conversion context based on
 216                // the contract's conversion context (reuse contract correlation information)
 217                WsdlEndpointConversionContext endpointContext;
 32218                if (newWsdlBinding)
 219                {
 32220                    endpointContext = new WsdlEndpointConversionContext(contractContext, endpoint, wsdlBinding, wsdlPort
 221
 382222                    foreach (OperationDescription operation in endpoint.Contract.Operations)
 223                    {
 159224                        if (!OperationIsExportable(operation))
 225                        {
 226                            continue;
 227                        }
 228
 159229                        WsdlNS.OperationBinding wsdlOperationBinding = CreateWsdlOperationBinding(operation);
 159230                        wsdlBinding.Operations.Add(wsdlOperationBinding);
 231
 159232                        endpointContext.AddOperationBinding(operation, wsdlOperationBinding);
 233
 954234                        foreach (MessageDescription message in operation.Messages)
 235                        {
 318236                            WsdlNS.MessageBinding wsdlMessageBinding = CreateWsdlMessageBinding(message, wsdlOperationBi
 318237                            endpointContext.AddMessageBinding(message, wsdlMessageBinding);
 238                        }
 239
 318240                        foreach (FaultDescription fault in operation.Faults)
 241                        {
 0242                            WsdlNS.FaultBinding wsdlFaultBinding = CreateWsdlFaultBinding(fault, wsdlOperationBinding);
 0243                            endpointContext.AddFaultBinding(fault, wsdlFaultBinding);
 244                        }
 245                    }
 246
 247                    // CSDMain 180381:  Added internal functionality for passing BindingParameters into the ExportPolicy
 248                    // However, in order to not change existing behavior, we only call the internal ExportPolicy method 
 249                    // (non-null binding parameters can only be passed in via internal code paths).  Otherwise, we call 
 250                    PolicyConversionContext policyContext;
 32251                    if (bindingParameters == null)
 252                    {
 0253                        policyContext = ExportPolicy(endpoint);
 254                    }
 255                    else
 256                    {
 32257                        policyContext = ExportPolicy(endpoint, bindingParameters);
 258                    }
 259                    // consider factoring this out of wsdl exporter
 32260                    new WSPolicyAttachmentHelper(PolicyVersion).AttachPolicy(endpoint, endpointContext, policyContext);
 32261                    _exportedBindings.Add(new BindingDictionaryKey(endpoint.Contract, endpoint.Binding), endpointContext
 262                }
 263                else
 264                {
 0265                    endpointContext = new WsdlEndpointConversionContext(_exportedBindings[new BindingDictionaryKey(endpo
 266                }
 267
 32268                CallExportEndpoint(endpointContext);
 32269                _exportedEndpoints.Add(endpointKey, endpoint);
 32270                if (bindingNameWasUniquified)
 271                {
 8272                    Errors.Add(new MetadataConversionError(SR.Format(SR.WarnDuplicateBindingQNameNameOnExport, endpoint.
 273                }
 32274            }
 0275            catch
 276            {
 0277                _isFaulted = true;
 0278                throw;
 279            }
 32280        }
 281
 41282        public static void AddWSAddressingAssertion(MetadataExporter exporter, PolicyConversionContext context, Addressi
 283
 284        private void CallExportEndpoint(WsdlEndpointConversionContext endpointContext)
 285        {
 510286            foreach (IWsdlExportExtension extension in endpointContext.ExportExtensions)
 287            {
 223288                CallExtension(endpointContext, extension);
 289            }
 32290        }
 291
 292        private void CallExportContract(WsdlContractConversionContext contractContext)
 293        {
 286294            foreach (IWsdlExportExtension extension in contractContext.ExportExtensions)
 295            {
 119296                CallExtension(contractContext, extension);
 297            }
 24298        }
 299
 300        private WsdlNS.PortType CreateWsdlPortType(ContractDescription contract)
 301        {
 24302            XmlQualifiedName wsdlPortTypeQName = WsdlNamingHelper.GetPortTypeQName(contract);
 303
 24304            WsdlNS.ServiceDescription wsdl = GetOrCreateWsdl(wsdlPortTypeQName.Namespace);
 24305            WsdlNS.PortType wsdlPortType = new WsdlNS.PortType
 24306            {
 24307                Name = wsdlPortTypeQName.Name
 24308            };
 24309            if (wsdl.PortTypes[wsdlPortType.Name] != null)
 310            {
 0311                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.DuplicateCo
 312            }
 313
 24314            NetSessionHelper.AddUsingSessionAttributeIfNeeded(wsdlPortType, contract);
 24315            wsdl.PortTypes.Add(wsdlPortType);
 316
 24317            return wsdlPortType;
 318        }
 319
 320        private WsdlNS.Operation CreateWsdlOperation(OperationDescription operation, ContractDescription contract)
 321        {
 119322            WsdlNS.Operation wsdlOperation = new WsdlNS.Operation
 119323            {
 119324                Name = WsdlNamingHelper.GetWsdlOperationName(operation)
 119325            };
 119326            NetSessionHelper.AddInitiatingTerminatingAttributesIfNeeded(wsdlOperation, operation, contract);
 119327            return wsdlOperation;
 328        }
 329
 330        private WsdlNS.OperationMessage CreateWsdlOperationMessage(MessageDescription message)
 331        {
 332            WsdlNS.OperationMessage wsdlOperationMessage;
 333
 238334            if (message.Direction == MessageDirection.Input)
 335            {
 119336                wsdlOperationMessage = new WsdlNS.OperationInput();
 337            }
 338            else
 339            {
 119340                wsdlOperationMessage = new WsdlNS.OperationOutput();
 341            }
 342
 238343            if (message.MessageType != null)
 344            {
 2345                string messageName = NamingHelper.TypeName(message.MessageType);
 2346                wsdlOperationMessage.Name = NamingHelper.XmlName(messageName);
 347            }
 348
 349            // consider factoring this out of wslExporter
 238350            WSAddressingHelper.AddActionAttribute(message.Action, wsdlOperationMessage, PolicyVersion);
 238351            return wsdlOperationMessage;
 352        }
 353
 354        private WsdlNS.OperationFault CreateWsdlOperationFault(FaultDescription fault)
 355        {
 356            WsdlNS.OperationFault wsdlOperationFault;
 0357            wsdlOperationFault = new WsdlNS.OperationFault
 0358            {
 0359                // operation fault name must not be empty (FaultDescription checks this)
 0360                Name = fault.Name
 0361            };
 362
 363            // consider factoring this out of wslExporter
 0364            WSAddressingHelper.AddActionAttribute(fault.Action, wsdlOperationFault, PolicyVersion);
 0365            return wsdlOperationFault;
 366        }
 367
 368        private WsdlNS.Binding CreateWsdlBindingAndPort(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, out
 369        {
 370            WsdlNS.ServiceDescription bindingWsdl;
 371            WsdlNS.Binding wsdlBinding;
 372            XmlQualifiedName wsdlBindingQName;
 373            XmlQualifiedName wsdlPortTypeQName;
 374            // There's a change in behavior from NetFx here. On NetFx, for any MessageEncodingBindingElement we
 375            // would call the internal virtual method IsWsdlExportable. This always returned true for all MEBE
 376            // implementations except WebMessageEncodingBindingElement which returned false. For CoreWCF,
 377            // we're not worrying about supressing exporting the wsdl. We'll either not add the relevant
 378            // interface, or we'll make the relevant method be a no-op to achieve the same thing.
 379            // bool printWsdlDeclaration = IsWsdlExportable(endpoint.Binding);
 380
 32381            if (!_exportedBindings.TryGetValue(new BindingDictionaryKey(endpoint.Contract, endpoint.Binding), out WsdlEn
 382            {
 32383                wsdlBindingQName = WsdlNamingHelper.GetBindingQName(endpoint, this, out bindingNameWasUniquified);
 32384                bindingWsdl = GetOrCreateWsdl(wsdlBindingQName.Namespace);
 32385                wsdlBinding = new WsdlNS.Binding { Name = wsdlBindingQName.Name };
 32386                newBinding = true;
 32387                WsdlNS.PortType wsdlPortType = _exportedContracts[endpoint.Contract].WsdlPortType;
 32388                wsdlPortTypeQName = new XmlQualifiedName(wsdlPortType.Name, wsdlPortType.ServiceDescription.TargetNamesp
 32389                wsdlBinding.Type = wsdlPortTypeQName;
 32390                bindingWsdl.Bindings.Add(wsdlBinding);
 391
 32392                EnsureWsdlContainsImport(bindingWsdl, wsdlPortTypeQName.Namespace);
 393            }
 394            else
 395            {
 0396                wsdlBindingQName = new XmlQualifiedName(bindingConversionContext.WsdlBinding.Name, bindingConversionCont
 0397                bindingNameWasUniquified = false;
 0398                bindingWsdl = GeneratedWsdlDocuments[wsdlBindingQName.Namespace];
 0399                wsdlBinding = bindingWsdl.Bindings[wsdlBindingQName.Name];
 0400                newBinding = false;
 401            }
 402
 403            //We can only create a Port if there is an address
 32404            if (endpoint.Address != null)
 405            {
 32406                WsdlNS.Service wsdlService = GetOrCreateWsdlService(wsdlServiceQName);
 32407                wsdlPort = new WsdlNS.Port();
 32408                string wsdlPortName = WsdlNamingHelper.GetPortName(endpoint, wsdlService);
 32409                wsdlPort.Name = wsdlPortName;
 32410                wsdlPort.Binding = wsdlBindingQName;
 32411                WsdlNS.SoapAddressBinding addressBinding = SoapHelper.GetOrCreateSoapAddressBinding(wsdlBinding, wsdlPor
 412
 32413                if (addressBinding != null)
 414                {
 32415                    addressBinding.Location = endpoint.Address.Uri.AbsoluteUri;
 416                }
 417
 32418                EnsureWsdlContainsImport(wsdlService.ServiceDescription, wsdlBindingQName.Namespace);
 32419                wsdlService.Ports.Add(wsdlPort);
 420            }
 421            else
 422            {
 0423                wsdlPort = null;
 424            }
 425
 32426            return wsdlBinding;
 427        }
 428
 0429        public static void AddAddressToWsdlPort(WsdlNS.Port wsdlPort, EndpointAddress address, AddressingVersion address
 430
 159431        private WsdlNS.OperationBinding CreateWsdlOperationBinding(OperationDescription operation) => new WsdlNS.Operati
 432
 433        private WsdlNS.MessageBinding CreateWsdlMessageBinding(MessageDescription messageDescription, WsdlNS.OperationBi
 434        {
 435            WsdlNS.MessageBinding wsdlMessageBinding;
 318436            if (messageDescription.Direction == MessageDirection.Input)
 437            {
 159438                wsdlOperationBinding.Input = new WsdlNS.InputBinding();
 159439                wsdlMessageBinding = wsdlOperationBinding.Input;
 440            }
 441            else
 442            {
 159443                wsdlOperationBinding.Output = new WsdlNS.OutputBinding();
 159444                wsdlMessageBinding = wsdlOperationBinding.Output;
 445            }
 446
 318447            if (messageDescription.MessageType != null)
 448            {
 2449                string messageName = NamingHelper.TypeName(messageDescription.MessageType);
 2450                wsdlMessageBinding.Name = NamingHelper.XmlName(messageName);
 451            }
 452
 318453            return wsdlMessageBinding;
 454        }
 455
 456        private WsdlNS.FaultBinding CreateWsdlFaultBinding(FaultDescription faultDescription, WsdlNS.OperationBinding ws
 457        {
 0458            WsdlNS.FaultBinding wsdlFaultBinding = new WsdlNS.FaultBinding();
 0459            wsdlOperationBinding.Faults.Add(wsdlFaultBinding);
 0460            if (faultDescription.Name != null)
 461            {
 0462                wsdlFaultBinding.Name = faultDescription.Name;
 463            }
 464
 0465            return wsdlFaultBinding;
 466        }
 467
 596468        internal static bool OperationIsExportable(OperationDescription operation) => OperationIsExportable(operation, o
 469
 470        internal static bool OperationIsExportable(OperationDescription operation, out bool isWildcardAction)
 471        {
 715472            isWildcardAction = false;
 473
 715474            if (operation.IsSessionOpenNotificationEnabled)
 475            {
 0476                return false;
 477            }
 478
 4290479            for (int i = 0; i < operation.Messages.Count; i++)
 480            {
 1430481                if (operation.Messages[i].Action == MessageHeaders.WildcardAction)
 482                {
 0483                    isWildcardAction = true;
 0484                    return false;
 485                }
 486            }
 487
 715488            return true;
 489        }
 490
 491        internal static bool IsBuiltInOperationBehavior(IWsdlExportExtension extension)
 492        {
 493            // This is a change in behavior from NetFx due to dcsob.IsBuiltInOperationBehavior not being public.
 494            // In NetFx, a user added dcsob would be treated as not built-in and the default added dcsob would be
 495            // treated as a built in operation. Being build in meant being placed at the end of the list returned
 496            // from WsdlContractConversionContext.ExportExtensions. In CoreWCF, dcsob will always be at the end of
 497            // the list. The same is true of xsob too.
 397498            if (extension is DataContractSerializerOperationBehavior || extension is XmlSerializerOperationBehavior)
 499            {
 397500                return true;
 501            }
 502
 0503            return false;
 504        }
 505
 506        private static XmlDocument XmlDoc
 507        {
 508            get
 509            {
 408510                if (s_xmlDocument == null)
 511                {
 1512                    NameTable nameTable = new NameTable();
 1513                    nameTable.Add(MetadataStrings.WSPolicy.Elements.Policy);
 1514                    nameTable.Add(MetadataStrings.WSPolicy.Elements.All);
 1515                    nameTable.Add(MetadataStrings.WSPolicy.Elements.ExactlyOne);
 1516                    nameTable.Add(MetadataStrings.WSPolicy.Attributes.PolicyURIs);
 1517                    nameTable.Add(MetadataStrings.Wsu.Attributes.Id);
 1518                    nameTable.Add(MetadataStrings.Addressing200408.Policy.UsingAddressing);
 1519                    nameTable.Add(MetadataStrings.Addressing10.WsdlBindingPolicy.UsingAddressing);
 1520                    nameTable.Add(MetadataStrings.Addressing10.MetadataPolicy.Addressing);
 1521                    nameTable.Add(MetadataStrings.Addressing10.MetadataPolicy.AnonymousResponses);
 1522                    nameTable.Add(MetadataStrings.Addressing10.MetadataPolicy.NonAnonymousResponses);
 1523                    s_xmlDocument = new XmlDocument(nameTable);
 524                }
 525
 408526                return s_xmlDocument;
 527            }
 528        }
 529
 530        // Generate WSDL Document if it doesn't already exist otherwise, return the appropriate WSDL document
 531        internal WsdlNS.ServiceDescription GetOrCreateWsdl(string ns)
 532        {
 533            // NOTE: this method is not thread safe
 88534            WsdlNS.ServiceDescriptionCollection wsdlCollection = GeneratedWsdlDocuments;
 88535            WsdlNS.ServiceDescription wsdl = wsdlCollection[ns];
 536
 537            // Look for wsdl in service descriptions that have been created. If we cannot find it then we create it
 88538            if (wsdl == null)
 539            {
 24540                wsdl = new WsdlNS.ServiceDescription { TargetNamespace = ns };
 24541                XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new WsdlNamespaceHelper(PolicyVersion).
 24542                if (!string.IsNullOrEmpty(wsdl.TargetNamespace))
 543                {
 24544                    namespaces.Add("tns", wsdl.TargetNamespace);
 545                }
 546
 24547                wsdl.Namespaces = namespaces;
 24548                wsdlCollection.Add(wsdl);
 549            }
 550
 88551            return wsdl;
 552        }
 553
 554        private WsdlNS.Service GetOrCreateWsdlService(XmlQualifiedName wsdlServiceQName)
 555        {
 556            // NOTE: this method is not thread safe
 32557            WsdlNS.ServiceDescription wsdl = GetOrCreateWsdl(wsdlServiceQName.Namespace);
 32558            WsdlNS.Service wsdlService = wsdl.Services[wsdlServiceQName.Name];
 32559            if (wsdlService == null)
 560            {
 561                //Service not found. Create service.
 24562                wsdlService = new WsdlNS.Service { Name = wsdlServiceQName.Name };
 24563                if (string.IsNullOrEmpty(wsdl.Name))
 564                {
 24565                    wsdl.Name = wsdlService.Name;
 566                }
 567
 24568                wsdl.Services.Add(wsdlService);
 569            }
 32570            return wsdlService;
 571        }
 572
 573        private static void EnsureWsdlContainsImport(WsdlNS.ServiceDescription srcWsdl, string target)
 574        {
 64575            if (srcWsdl.TargetNamespace == target)
 576            {
 64577                return;
 578            }
 579
 580            // FindImport
 0581            foreach (WsdlNS.Import import in srcWsdl.Imports)
 582            {
 0583                if (import.Namespace == target)
 584                {
 0585                    return;
 586                }
 587            }
 588
 589            {
 0590                WsdlNS.Import import = new WsdlNS.Import
 0591                {
 0592                    Location = null,
 0593                    Namespace = target
 0594                };
 0595                srcWsdl.Imports.Add(import);
 0596                WsdlNamespaceHelper.FindOrCreatePrefix("i", target, srcWsdl);
 0597                return;
 598            }
 0599        }
 600
 0601        private void LogExportWarning(string warningMessage) => Errors.Add(new MetadataConversionError(warningMessage, t
 602
 47603        internal static XmlSchemaSet GetEmptySchemaSet() => new XmlSchemaSet { XmlResolver = null };
 604
 605        internal static class WSAddressingHelper
 606        {
 607            internal static void AddActionAttribute(string actionUri, WsdlNS.OperationMessage wsdlOperationMessage, Poli
 608            {
 609                XmlAttribute attribute;
 238610                if (policyVersion == PolicyVersion.Policy12)
 611                {
 238612                    attribute = XmlDoc.CreateAttribute(MetadataStrings.AddressingWsdl.Prefix,
 238613                        MetadataStrings.AddressingWsdl.Action,
 238614                        MetadataStrings.AddressingWsdl.NamespaceUri);
 615                }
 616                else
 617                {
 0618                    attribute = XmlDoc.CreateAttribute(MetadataStrings.AddressingMetadata.Prefix,
 0619                        MetadataStrings.AddressingMetadata.Action,
 0620                        MetadataStrings.AddressingMetadata.NamespaceUri);
 621                }
 622
 238623                attribute.Value = actionUri;
 238624                wsdlOperationMessage.ExtensibleAttributes = new XmlAttribute[] { attribute };
 238625            }
 626
 627            internal static void AddAddressToWsdlPort(WsdlNS.Port wsdlPort, EndpointAddress addr, AddressingVersion addr
 628            {
 32629                if (addressing == AddressingVersion.None)
 630                {
 21631                    return;
 632                }
 633
 11634                MemoryStream stream = new MemoryStream();
 11635                XmlWriter xw = XmlWriter.Create(stream);
 11636                xw.WriteStartElement("temp");
 637
 11638                if (addressing == AddressingVersion.WSAddressing10)
 639                {
 11640                    xw.WriteAttributeString("xmlns", MetadataStrings.Addressing10.Prefix, null, MetadataStrings.Addressi
 641                }
 0642                else if (addressing == AddressingVersion.WSAddressingAugust2004)
 643                {
 0644                    xw.WriteAttributeString("xmlns", MetadataStrings.Addressing200408.Prefix, null, MetadataStrings.Addr
 645                }
 646                else
 647                {
 0648                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
 0649                        new InvalidOperationException(SR.Format(SR.AddressingVersionNotSupported, addressing)));
 650                }
 651
 11652                addr.WriteTo(addressing, xw);
 11653                xw.WriteEndElement();
 654
 11655                xw.Flush();
 11656                stream.Seek(0, SeekOrigin.Begin);
 657
 11658                XmlReader xr = XmlReader.Create(stream);
 11659                xr.MoveToContent();
 11660                XmlElement endpointRef = (XmlElement)XmlDoc.ReadNode(xr).ChildNodes[0];
 661
 11662                wsdlPort.Extensions.Add(endpointRef);
 11663            }
 664
 665            internal static void AddWSAddressingAssertion(MetadataExporter exporter, PolicyConversionContext context, Ad
 666            {
 667                XmlElement addressingAssertion;
 41668                if (addressVersion == AddressingVersion.WSAddressingAugust2004)
 669                {
 0670                    addressingAssertion = XmlDoc.CreateElement(MetadataStrings.Addressing200408.Policy.Prefix,
 0671                        MetadataStrings.Addressing200408.Policy.UsingAddressing,
 0672                        MetadataStrings.Addressing200408.Policy.NamespaceUri);
 673                }
 41674                else if (addressVersion == AddressingVersion.WSAddressing10)
 675                {
 20676                    if (exporter.PolicyVersion == PolicyVersion.Policy12)
 677                    {
 20678                        addressingAssertion = XmlDoc.CreateElement(MetadataStrings.Addressing10.WsdlBindingPolicy.Prefix
 20679                            MetadataStrings.Addressing10.WsdlBindingPolicy.UsingAddressing,
 20680                            MetadataStrings.Addressing10.WsdlBindingPolicy.NamespaceUri);
 681                    }
 682                    else
 683                    {
 0684                        addressingAssertion = XmlDoc.CreateElement(MetadataStrings.Addressing10.MetadataPolicy.Prefix,
 0685                            MetadataStrings.Addressing10.MetadataPolicy.Addressing,
 0686                            MetadataStrings.Addressing10.MetadataPolicy.NamespaceUri);
 687
 688                        // On NetFx, there is an enum SupportedAddressingMode which is only used by CompositeDuplexBindi
 689                        // which we don't support yet. This means all transports are treated as though they are using
 690                        // SupportedAddressingMode.Anonymous. This code has been modified to only have the behavior of t
 691
 692                        string responsesAssertionLocalName;
 0693                        responsesAssertionLocalName = MetadataStrings.Addressing10.MetadataPolicy.AnonymousResponses;
 694
 0695                        XmlElement innerPolicyElement = XmlDoc.CreateElement(MetadataStrings.WSPolicy.Prefix,
 0696                                MetadataStrings.WSPolicy.Elements.Policy,
 0697                                MetadataStrings.WSPolicy.NamespaceUri15);
 698
 0699                        XmlElement responsesAssertion = XmlDoc.CreateElement(MetadataStrings.Addressing10.MetadataPolicy
 0700                                responsesAssertionLocalName,
 0701                                MetadataStrings.Addressing10.MetadataPolicy.NamespaceUri);
 702
 0703                        innerPolicyElement.AppendChild(responsesAssertion);
 0704                        addressingAssertion.AppendChild(innerPolicyElement);
 705                    }
 706                }
 21707                else if (addressVersion == AddressingVersion.None)
 708                {
 709                    // do nothing
 21710                    addressingAssertion = null;
 711                }
 712                else
 713                {
 0714                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
 0715                        new InvalidOperationException(SR.Format(SR.AddressingVersionNotSupported, addressVersion)));
 716                }
 717
 41718                if (addressingAssertion != null)
 719                {
 20720                    context.GetBindingAssertions().Add(addressingAssertion);
 721                }
 41722            }
 723        }
 724
 725        private class WSPolicyAttachmentHelper
 726        {
 727            private readonly PolicyVersion _policyVersion;
 728
 32729            internal WSPolicyAttachmentHelper(PolicyVersion policyVersion)
 730            {
 32731                _policyVersion = policyVersion;
 32732            }
 733
 734            internal void AttachPolicy(ServiceEndpoint endpoint, WsdlEndpointConversionContext endpointContext, PolicyCo
 735            {
 32736                SortedList<string, string> policyKeys = new SortedList<string, string>();
 32737                NamingHelper.DoesNameExist policyKeyIsUnique
 46738                    = (string name, object nameCollection) => policyKeys.ContainsKey(name);
 739
 740                string key, keyBase;
 741                ICollection<XmlElement> assertions;
 742
 32743                WsdlNS.ServiceDescription policyWsdl = endpointContext.WsdlBinding.ServiceDescription;
 744
 32745                assertions = policyContext.GetBindingAssertions();
 746
 747                // Add [wsdl:Binding] level Policy
 32748                WsdlNS.Binding wsdlBinding = endpointContext.WsdlBinding;
 32749                if (assertions.Count > 0)
 750                {
 14751                    keyBase = CreateBindingPolicyKey(wsdlBinding);
 14752                    key = NamingHelper.GetUniqueName(keyBase, policyKeyIsUnique, null);
 14753                    policyKeys.Add(key, key);
 14754                    AttachItemPolicy(assertions, key, policyWsdl, wsdlBinding);
 755                }
 756
 382757                foreach (OperationDescription operation in endpoint.Contract.Operations)
 758                {
 159759                    if (!OperationIsExportable(operation))
 760                    {
 761                        continue;
 762                    }
 763
 159764                    assertions = policyContext.GetOperationBindingAssertions(operation);
 765
 766                    // Add [wsdl:Binding/wsdl:operation] policy
 159767                    if (assertions.Count > 0)
 768                    {
 0769                        WsdlNS.OperationBinding wsdlOperationBinding = endpointContext.GetOperationBinding(operation);
 0770                        keyBase = CreateOperationBindingPolicyKey(wsdlOperationBinding);
 0771                        key = NamingHelper.GetUniqueName(keyBase, policyKeyIsUnique, null);
 0772                        policyKeys.Add(key, key);
 0773                        AttachItemPolicy(assertions, key, policyWsdl, wsdlOperationBinding);
 774                    }
 775
 776                    //
 777                    // Add [wsdl:Binding/wsdl:operation] child policy
 778                    //
 779
 954780                    foreach (MessageDescription message in operation.Messages)
 781                    {
 318782                        assertions = policyContext.GetMessageBindingAssertions(message);
 783
 784                        // Add [wsdl:Binding/wsdl:operation/wsdl:(input, output, message)] policy
 318785                        if (assertions.Count > 0)
 786                        {
 0787                            WsdlNS.MessageBinding wsdlMessageBinding = endpointContext.GetMessageBinding(message);
 0788                            keyBase = CreateMessageBindingPolicyKey(wsdlMessageBinding, message.Direction);
 0789                            key = NamingHelper.GetUniqueName(keyBase, policyKeyIsUnique, null);
 0790                            policyKeys.Add(key, key);
 0791                            AttachItemPolicy(assertions, key, policyWsdl, wsdlMessageBinding);
 792                        }
 793                    }
 794
 318795                    foreach (FaultDescription fault in operation.Faults)
 796                    {
 0797                        assertions = policyContext.GetFaultBindingAssertions(fault);
 798
 799                        // Add [wsdl:Binding/wsdl:operation/wsdl:fault] policy
 0800                        if (assertions.Count > 0)
 801                        {
 0802                            WsdlNS.FaultBinding wsdlFaultBinding = endpointContext.GetFaultBinding(fault);
 0803                            keyBase = CreateFaultBindingPolicyKey(wsdlFaultBinding);
 0804                            key = NamingHelper.GetUniqueName(keyBase, policyKeyIsUnique, null);
 0805                            policyKeys.Add(key, key);
 0806                            AttachItemPolicy(assertions, key, policyWsdl, wsdlFaultBinding);
 807                        }
 808                    }
 809                }
 32810            }
 811
 812            private void AttachItemPolicy(ICollection<XmlElement> assertions, string key, WsdlNS.ServiceDescription poli
 813            {
 14814                string policyKey = InsertPolicy(key, policyWsdl, assertions);
 14815                InsertPolicyReference(policyKey, item);
 14816            }
 817
 818            private void InsertPolicyReference(string policyKey, WsdlNS.DocumentableItem item)
 819            {
 820                //Create wsp:PolicyReference Element On DocumentableItem
 821                //------------------------------------------------------------------------------------------------------
 14822                XmlElement policyReferenceElement = XmlDoc.CreateElement(MetadataStrings.WSPolicy.Prefix,
 14823                                                            MetadataStrings.WSPolicy.Elements.PolicyReference,
 14824                                                            _policyVersion.Namespace);
 825
 826                //Create wsp:PolicyURIs Attribute On DocumentableItem
 827                //------------------------------------------------------------------------------------------------------
 14828                XmlAttribute uriAttribute = XmlDoc.CreateAttribute(MetadataStrings.WSPolicy.Attributes.URI);
 829
 14830                uriAttribute.Value = policyKey;
 14831                policyReferenceElement.Attributes.Append(uriAttribute);
 14832                item.Extensions.Add(policyReferenceElement);
 14833            }
 834
 835            private string InsertPolicy(string key, WsdlNS.ServiceDescription policyWsdl, ICollection<XmlElement> assert
 836            {
 837                // Create [wsp:Policy]
 14838                XmlElement policyElement = CreatePolicyElement(assertions);
 839
 840                //Create [wsp:Policy/@wsu:Id]
 14841                XmlAttribute idAttribute = XmlDoc.CreateAttribute(MetadataStrings.Wsu.Prefix,
 14842                                                            MetadataStrings.Wsu.Attributes.Id,
 14843                                                            MetadataStrings.Wsu.NamespaceUri);
 14844                idAttribute.Value = key;
 14845                policyElement.SetAttributeNode(idAttribute);
 846
 847                // Add wsp:Policy To WSDL
 14848                if (policyWsdl != null)
 849                {
 14850                    policyWsdl.Extensions.Add(policyElement);
 851                }
 852
 14853                return string.Format(CultureInfo.InvariantCulture, "#{0}", key);
 854            }
 855
 856            private XmlElement CreatePolicyElement(ICollection<XmlElement> assertions)
 857            {
 858                // Create [wsp:Policy]
 14859                XmlElement policyElement = XmlDoc.CreateElement(MetadataStrings.WSPolicy.Prefix,
 14860                                                            MetadataStrings.WSPolicy.Elements.Policy,
 14861                                                            _policyVersion.Namespace);
 862
 863                // Create [wsp:Policy/wsp:ExactlyOne]
 14864                XmlElement exactlyOneElement = XmlDoc.CreateElement(MetadataStrings.WSPolicy.Prefix,
 14865                                                            MetadataStrings.WSPolicy.Elements.ExactlyOne,
 14866                                                            _policyVersion.Namespace);
 14867                policyElement.AppendChild(exactlyOneElement);
 868
 869                // Create [wsp:Policy/wsp:ExactlyOne/wsp:All]
 14870                XmlElement allElement = XmlDoc.CreateElement(MetadataStrings.WSPolicy.Prefix,
 14871                                                            MetadataStrings.WSPolicy.Elements.All,
 14872                                                            _policyVersion.Namespace);
 14873                exactlyOneElement.AppendChild(allElement);
 874
 875                // Add [wsp:Policy/wsp:ExactlyOne/wsp:All/*]
 138876                foreach (XmlElement assertion in assertions)
 877                {
 55878                    XmlNode iNode = XmlDoc.ImportNode(assertion, true);
 55879                    allElement.AppendChild(iNode);
 880                }
 881
 14882                return policyElement;
 883            }
 884
 14885            private static string CreateBindingPolicyKey(WsdlNS.Binding wsdlBinding) => string.Format(CultureInfo.Invari
 886
 0887            private static string CreateOperationBindingPolicyKey(WsdlNS.OperationBinding wsdlOperationBinding) => strin
 0888                    wsdlOperationBinding.Binding.Name,
 0889                    wsdlOperationBinding.Name);
 890
 891            private static string CreateMessageBindingPolicyKey(WsdlNS.MessageBinding wsdlMessageBinding, MessageDirecti
 892            {
 0893                WsdlNS.OperationBinding wsdlOperationBinding = wsdlMessageBinding.OperationBinding;
 0894                WsdlNS.Binding wsdlBinding = wsdlOperationBinding.Binding;
 895
 0896                if (direction == MessageDirection.Input)
 897                {
 0898                    return string.Format(CultureInfo.InvariantCulture, "{0}_{1}_Input_policy", wsdlBinding.Name, wsdlOpe
 899                }
 900                else
 901                {
 0902                    return string.Format(CultureInfo.InvariantCulture, "{0}_{1}_output_policy", wsdlBinding.Name, wsdlOp
 903                }
 904            }
 905
 906            private static string CreateFaultBindingPolicyKey(WsdlNS.FaultBinding wsdlFaultBinding)
 907            {
 0908                WsdlNS.OperationBinding wsdlOperationBinding = wsdlFaultBinding.OperationBinding;
 0909                WsdlNS.Binding wsdlBinding = wsdlOperationBinding.Binding;
 0910                if (string.IsNullOrEmpty(wsdlFaultBinding.Name))
 911                {
 0912                    return string.Format(CultureInfo.InvariantCulture, "{0}_{1}_Fault", wsdlBinding.Name, wsdlOperationB
 913                }
 914                else
 915                {
 0916                    return string.Format(CultureInfo.InvariantCulture, "{0}_{1}_{2}_Fault", wsdlBinding.Name, wsdlOperat
 917                }
 918            }
 919
 920        }
 921
 922        private class WsdlNamespaceHelper
 923        {
 924            private XmlSerializerNamespaces _xmlSerializerNamespaces;
 925            private readonly PolicyVersion _policyVersion;
 926            internal XmlSerializerNamespaces SerializerNamespaces
 927            {
 928                get
 929                {
 24930                    if (_xmlSerializerNamespaces == null)
 931                    {
 24932                        XmlSerializerNamespaceWrapper namespaces = new XmlSerializerNamespaceWrapper();
 24933                        namespaces.Add("wsdl", WsdlNS.ServiceDescription.Namespace);
 24934                        namespaces.Add("xsd", XmlSchema.Namespace);
 24935                        namespaces.Add(MetadataStrings.WSPolicy.Prefix, _policyVersion.Namespace);
 24936                        namespaces.Add(MetadataStrings.Wsu.Prefix, MetadataStrings.Wsu.NamespaceUri);
 24937                        namespaces.Add(MetadataStrings.Addressing200408.Prefix, MetadataStrings.Addressing200408.Namespa
 24938                        namespaces.Add(MetadataStrings.Addressing200408.Policy.Prefix, MetadataStrings.Addressing200408.
 24939                        namespaces.Add(MetadataStrings.Addressing10.Prefix, MetadataStrings.Addressing10.NamespaceUri);
 24940                        namespaces.Add(MetadataStrings.Addressing10.WsdlBindingPolicy.Prefix, MetadataStrings.Addressing
 24941                        namespaces.Add(MetadataStrings.Addressing10.MetadataPolicy.Prefix, MetadataStrings.Addressing10.
 24942                        namespaces.Add(MetadataStrings.MetadataExchangeStrings.Prefix, MetadataStrings.MetadataExchangeS
 24943                        namespaces.Add(NetSessionHelper.Prefix, NetSessionHelper.NamespaceUri);
 944
 24945                        namespaces.Add("soapenc", "http://schemas.xmlsoap.org/soap/encoding/");
 24946                        namespaces.Add("soap12", "http://schemas.xmlsoap.org/wsdl/soap12/");
 24947                        namespaces.Add("soap", "http://schemas.xmlsoap.org/wsdl/soap/");
 948
 24949                        _xmlSerializerNamespaces = namespaces.GetNamespaces();
 950                    }
 951
 24952                    return _xmlSerializerNamespaces;
 953                }
 954            }
 955
 24956            internal WsdlNamespaceHelper(PolicyVersion policyVersion)
 957            {
 24958                _policyVersion = policyVersion;
 24959            }
 960
 961            // doesn't care if you add a duplicate prefix
 962            private class XmlSerializerNamespaceWrapper
 963            {
 24964                private readonly XmlSerializerNamespaces _namespaces = new XmlSerializerNamespaces();
 24965                private readonly Dictionary<string, string> _lookup = new Dictionary<string, string>();
 966
 967                internal void Add(string prefix, string namespaceUri)
 968                {
 336969                    if (!_lookup.ContainsKey(prefix))
 970                    {
 336971                        _namespaces.Add(prefix, namespaceUri);
 336972                        _lookup.Add(prefix, namespaceUri);
 973                    }
 336974                }
 975
 24976                internal XmlSerializerNamespaces GetNamespaces() => _namespaces;
 977            }
 978
 979            internal static string FindOrCreatePrefix(string prefixBase, string ns, params WsdlNS.DocumentableItem[] sco
 980            {
 0981                if (!(scopes.Length > 0))
 982                {
 983                    Fx.Assert("You must pass at least one namespaceScope");
 0984                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(string.Forma
 985                }
 986
 987                string prefix;
 0988                if (string.IsNullOrEmpty(ns))
 989                {
 0990                    prefix = string.Empty;
 991                }
 992                else
 993                {
 994                    //See if a prefix for the namespace has already been defined at one of the scopes
 0995                    for (int j = 0; j < scopes.Length; j++)
 996                    {
 0997                        if (TryMatchNamespace(scopes[j].Namespaces.ToArray(), ns, out prefix))
 998                        {
 0999                            return prefix;
 1000                        }
 1001                    }
 1002
 1003                    // Create prefix definition at the nearest scope.
 01004                    int i = 0;
 01005                    prefix = prefixBase + i.ToString(CultureInfo.InvariantCulture);
 1006
 1007                    //hsomu, consider do we need to check at higher scopes as well?
 01008                    while (PrefixExists(scopes[0].Namespaces.ToArray(), prefix))
 1009                    {
 01010                        prefix = prefixBase + (++i).ToString(CultureInfo.InvariantCulture);
 1011                    }
 1012                }
 1013
 01014                scopes[0].Namespaces.Add(prefix, ns);
 01015                return prefix;
 1016            }
 1017
 01018            private static bool PrefixExists(XmlQualifiedName[] prefixDefinitions, string prefix) => Array.Exists(prefix
 1019
 1020            private static bool TryMatchNamespace(XmlQualifiedName[] prefixDefinitions, string ns, out string prefix)
 1021            {
 01022                XmlQualifiedName foundPrefixDef = prefixDefinitions.Where(prefixDef => prefixDef.Namespace == ns).FirstO
 01023                prefix = foundPrefixDef?.Name;
 01024                return foundPrefixDef != null;
 1025            }
 1026        }
 1027
 1028        internal static class WsdlNamingHelper
 1029        {
 241030            internal static XmlQualifiedName GetPortTypeQName(ContractDescription contract) => new XmlQualifiedName(cont
 1031
 1032            internal static string GetUniqueName(string baseName, Func<string, object, bool> doesNameExist, object nameC
 1033            {
 01034                for (int i = 0; i < int.MaxValue; i++)
 1035                {
 01036                    string name = i > 0 ? baseName + i : baseName;
 01037                    if (!doesNameExist(name, nameCollection))
 1038                    {
 01039                        return name;
 1040                    }
 1041                }
 1042
 1043                Fx.Assert("Too Many Names");
 01044                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(string.Format(Cu
 1045            }
 1046
 1047            internal static XmlQualifiedName GetBindingQName(ServiceEndpoint endpoint, WsdlExporter exporter, out bool w
 1048            {
 1049                // due to problems in Sysytem.Web.Services.Descriprion.ServiceDescription.Write() (double encoding) meth
 1050                // wsdl:binding item: we need to make sure that XmlConvert.EncodeLocalName will not find any problems wi
 1051                // consider changing the name here to something that will not be encoded by XmlSerializer (GenerateSimpl
 321052                string localName = endpoint.Name;
 321053                string bindingWsdlNamespace = endpoint.Binding.Namespace;
 321054                string uniquifiedLocalName = NamingHelper.GetUniqueName(localName, WsdlBindingQNameExists(exporter, bind
 321055                wasUniquified = localName != uniquifiedLocalName;
 321056                return new XmlQualifiedName(uniquifiedLocalName, bindingWsdlNamespace);
 1057            }
 1058
 1059            private static NamingHelper.DoesNameExist WsdlBindingQNameExists(WsdlExporter exporter, string bindingWsdlNa
 1060            {
 1061                bool WsdlBindingQNameExistsImpl(string localName, object nameCollection)
 1062                {
 511063                    WsdlNS.ServiceDescription wsdl = exporter.GeneratedWsdlDocuments[bindingWsdlNamespace];
 511064                    if (wsdl != null && wsdl.Bindings[localName] != null)
 1065                    {
 191066                        return true;
 1067                    }
 1068
 321069                    return false;
 1070                }
 1071
 321072                return WsdlBindingQNameExistsImpl;
 1073            }
 1074
 321075            internal static string GetPortName(ServiceEndpoint endpoint, WsdlNS.Service wsdlService) => NamingHelper.Get
 1076
 1077            private static NamingHelper.DoesNameExist ServiceContainsPort(WsdlNS.Service service)
 1078            {
 1421079                return (string portName, object nameCollection) => service.Ports.Cast<WsdlNS.Port>().Any(port => port.Na
 1080            }
 1081
 2781082            internal static string GetWsdlOperationName(OperationDescription operationDescription) => operationDescripti
 1083        }
 1084
 1085        internal static class NetSessionHelper
 1086        {
 1087            internal const string NamespaceUri = "http://schemas.microsoft.com/ws/2005/12/wsdl/contract";
 1088            internal const string Prefix = "msc";
 1089            internal const string UsingSession = "usingSession";
 1090            internal const string IsInitiating = "isInitiating";
 1091            internal const string IsTerminating = "isTerminating";
 1092            internal const string True = "true";
 1093            internal const string False = "false";
 1094
 1095            internal static void AddUsingSessionAttributeIfNeeded(WsdlNS.PortType wsdlPortType, ContractDescription cont
 1096            {
 1097                bool sessionValue;
 1098
 241099                if (contract.SessionMode == SessionMode.Required)
 1100                {
 01101                    sessionValue = true;
 1102                }
 241103                else if (contract.SessionMode == SessionMode.NotAllowed)
 1104                {
 01105                    sessionValue = false;
 1106                }
 1107                else
 1108                {
 241109                    return;
 1110                }
 1111
 01112                wsdlPortType.ExtensibleAttributes = CloneAndAddToAttributes(wsdlPortType.ExtensibleAttributes, Prefix,
 01113                    UsingSession, NamespaceUri, ToValue(sessionValue));
 01114            }
 1115
 1116            internal static void AddInitiatingTerminatingAttributesIfNeeded(WsdlNS.Operation wsdlOperation,
 1117                OperationDescription operation, ContractDescription contract)
 1118            {
 1191119                if (contract.SessionMode == SessionMode.Required)
 1120                {
 01121                    AddInitiatingAttribute(wsdlOperation, operation.IsInitiating);
 01122                    AddTerminatingAttribute(wsdlOperation, operation.IsTerminating);
 1123                }
 1191124            }
 1125
 01126            private static void AddInitiatingAttribute(System.Web.Services.Description.Operation wsdlOperation, bool isI
 01127                    IsInitiating, NamespaceUri, ToValue(isInitiating));
 1128
 01129            private static void AddTerminatingAttribute(System.Web.Services.Description.Operation wsdlOperation, bool is
 01130                    IsTerminating, NamespaceUri, ToValue(isTerminating));
 1131
 1132            private static XmlAttribute[] CloneAndAddToAttributes(XmlAttribute[] originalAttributes, string prefix, stri
 1133            {
 01134                XmlAttribute newAttribute = XmlDoc.CreateAttribute(prefix, localName, ns);
 01135                newAttribute.Value = value;
 1136
 01137                int originalAttributeCount = 0;
 01138                if (originalAttributes != null)
 1139                {
 01140                    originalAttributeCount = originalAttributes.Length;
 1141                }
 1142
 01143                XmlAttribute[] attributes = new XmlAttribute[originalAttributeCount + 1];
 1144
 01145                if (originalAttributes != null)
 1146                {
 01147                    originalAttributes.CopyTo(attributes, 0);
 1148                }
 1149
 01150                attributes[attributes.Length - 1] = newAttribute;
 1151
 01152                return attributes;
 1153            }
 1154
 01155            private static string ToValue(bool b) => b ? True : False;
 1156        }
 1157
 1158        private void CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension)
 1159        {
 1160            try
 1161            {
 1191162                extension.ExportContract(this, contractContext);
 1191163            }
 01164            catch (Exception e)
 1165            {
 01166                if (Fx.IsFatal(e))
 1167                {
 01168                    throw;
 1169                }
 1170
 01171                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(ThrowExtensionException(contractContext.Contra
 1172            }
 1191173        }
 1174
 1175        private void CallExtension(WsdlEndpointConversionContext endpointContext, IWsdlExportExtension extension)
 1176        {
 1177            try
 1178            {
 2231179                extension.ExportEndpoint(this, endpointContext);
 2231180            }
 01181            catch (Exception e)
 1182            {
 01183                if (Fx.IsFatal(e))
 1184                {
 01185                    throw;
 1186                }
 1187
 01188                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(ThrowExtensionException(endpointContext.Endpoi
 1189            }
 2231190        }
 1191
 1192        private Exception ThrowExtensionException(ContractDescription contract, IWsdlExportExtension exporter, Exception
 1193        {
 01194            string contractIdentifier = new XmlQualifiedName(contract.Name, contract.Namespace).ToString();
 01195            string errorMessage = SR.Format(SR.WsdlExtensionContractExportError, exporter.GetType(), contractIdentifier)
 1196
 01197            return new InvalidOperationException(errorMessage, e);
 1198        }
 1199
 1200        private Exception ThrowExtensionException(ServiceEndpoint endpoint, IWsdlExportExtension exporter, Exception e)
 1201        {
 1202            string endpointIdentifier;
 01203            if (endpoint.Address != null && endpoint.Address.Uri != null)
 1204            {
 01205                endpointIdentifier = endpoint.Address.Uri.ToString();
 1206            }
 1207            else
 1208            {
 01209                endpointIdentifier = string.Format(CultureInfo.InvariantCulture,
 01210                    "Contract={1}:{0} ,Binding={3}:{2}",
 01211                    endpoint.Contract.Name,
 01212                    endpoint.Contract.Namespace,
 01213                    endpoint.Binding.Name,
 01214                    endpoint.Binding.Namespace);
 1215            }
 1216
 01217            string errorMessage = SR.Format(SR.WsdlExtensionEndpointExportError, exporter.GetType(), endpointIdentifier)
 1218
 01219            return new InvalidOperationException(errorMessage, e);
 1220        }
 1221
 1222        private sealed class BindingDictionaryKey
 1223        {
 1224            public readonly ContractDescription Contract;
 1225            public readonly Binding Binding;
 1226
 641227            public BindingDictionaryKey(ContractDescription contract, Binding binding)
 1228            {
 641229                Contract = contract;
 641230                Binding = binding;
 641231            }
 1232
 1233            public override bool Equals(object obj)
 1234            {
 01235                if (obj is BindingDictionaryKey key && key.Binding == Binding && key.Contract == Contract)
 1236                {
 01237                    return true;
 1238                }
 1239
 01240                return false;
 1241            }
 1242
 401243            public override int GetHashCode() => Contract.GetHashCode() ^ Binding.GetHashCode();
 1244        }
 1245
 1246        private sealed class EndpointDictionaryKey
 1247        {
 1248            public readonly ServiceEndpoint Endpoint;
 1249            public readonly XmlQualifiedName ServiceQName;
 1250
 321251            public EndpointDictionaryKey(ServiceEndpoint endpoint, XmlQualifiedName serviceQName)
 1252            {
 321253                Endpoint = endpoint;
 321254                ServiceQName = serviceQName;
 321255            }
 1256
 1257            public override bool Equals(object obj)
 1258            {
 01259                if (obj is EndpointDictionaryKey key && key.Endpoint == Endpoint && key.ServiceQName == ServiceQName)
 1260                {
 01261                    return true;
 1262                }
 1263
 01264                return false;
 1265            }
 1266
 401267            public override int GetHashCode() => Endpoint.GetHashCode() ^ ServiceQName.GetHashCode();
 1268        }
 1269    }
 1270}

Methods/Properties

.ctor()
Clone()
ExportContract(CoreWCF.Description.ContractDescription)
ExportEndpoint(CoreWCF.Description.ServiceEndpoint)
ExportEndpoints(System.Collections.Generic.IEnumerable`1<CoreWCF.Description.ServiceEndpoint>,System.Xml.XmlQualifiedName)
ExportEndpoints(System.Collections.Generic.IEnumerable`1<CoreWCF.Description.ServiceEndpoint>,System.Xml.XmlQualifiedName,CoreWCF.Channels.BindingParameterCollection)
GetGeneratedMetadata()
GeneratedWsdlDocuments()
GeneratedXmlSchemas()
ExportEndpoint(CoreWCF.Description.ServiceEndpoint,System.Xml.XmlQualifiedName,CoreWCF.Channels.BindingParameterCollection)
AddWSAddressingAssertion(CoreWCF.Description.MetadataExporter,CoreWCF.Description.PolicyConversionContext,CoreWCF.Channels.AddressingVersion)
CallExportEndpoint(CoreWCF.Description.WsdlEndpointConversionContext)
CallExportContract(CoreWCF.Description.WsdlContractConversionContext)
CreateWsdlPortType(CoreWCF.Description.ContractDescription)
CreateWsdlOperation(CoreWCF.Description.OperationDescription,CoreWCF.Description.ContractDescription)
CreateWsdlOperationMessage(CoreWCF.Description.MessageDescription)
CreateWsdlOperationFault(CoreWCF.Description.FaultDescription)
CreateWsdlBindingAndPort(CoreWCF.Description.ServiceEndpoint,System.Xml.XmlQualifiedName,System.Web.Services.Description.Port&,System.Boolean&,System.Boolean&)
AddAddressToWsdlPort(System.Web.Services.Description.Port,CoreWCF.EndpointAddress,CoreWCF.Channels.AddressingVersion)
CreateWsdlOperationBinding(CoreWCF.Description.OperationDescription)
CreateWsdlMessageBinding(CoreWCF.Description.MessageDescription,System.Web.Services.Description.OperationBinding)
CreateWsdlFaultBinding(CoreWCF.Description.FaultDescription,System.Web.Services.Description.OperationBinding)
OperationIsExportable(CoreWCF.Description.OperationDescription)
OperationIsExportable(CoreWCF.Description.OperationDescription,System.Boolean&)
IsBuiltInOperationBehavior(CoreWCF.Description.IWsdlExportExtension)
XmlDoc()
GetOrCreateWsdl(System.String)
GetOrCreateWsdlService(System.Xml.XmlQualifiedName)
EnsureWsdlContainsImport(System.Web.Services.Description.ServiceDescription,System.String)
LogExportWarning(System.String)
GetEmptySchemaSet()
AddActionAttribute(System.String,System.Web.Services.Description.OperationMessage,CoreWCF.Description.PolicyVersion)
AddAddressToWsdlPort(System.Web.Services.Description.Port,CoreWCF.EndpointAddress,CoreWCF.Channels.AddressingVersion)
AddWSAddressingAssertion(CoreWCF.Description.MetadataExporter,CoreWCF.Description.PolicyConversionContext,CoreWCF.Channels.AddressingVersion)
.ctor(CoreWCF.Description.PolicyVersion)
AttachPolicy(CoreWCF.Description.ServiceEndpoint,CoreWCF.Description.WsdlEndpointConversionContext,CoreWCF.Description.PolicyConversionContext)
AttachItemPolicy(System.Collections.Generic.ICollection`1<System.Xml.XmlElement>,System.String,System.Web.Services.Description.ServiceDescription,System.Web.Services.Description.DocumentableItem)
InsertPolicyReference(System.String,System.Web.Services.Description.DocumentableItem)
InsertPolicy(System.String,System.Web.Services.Description.ServiceDescription,System.Collections.Generic.ICollection`1<System.Xml.XmlElement>)
CreatePolicyElement(System.Collections.Generic.ICollection`1<System.Xml.XmlElement>)
CreateBindingPolicyKey(System.Web.Services.Description.Binding)
CreateOperationBindingPolicyKey(System.Web.Services.Description.OperationBinding)
CreateMessageBindingPolicyKey(System.Web.Services.Description.MessageBinding,CoreWCF.Description.MessageDirection)
CreateFaultBindingPolicyKey(System.Web.Services.Description.FaultBinding)
SerializerNamespaces()
.ctor(CoreWCF.Description.PolicyVersion)
.ctor()
Add(System.String,System.String)
GetNamespaces()
FindOrCreatePrefix(System.String,System.String,System.Web.Services.Description.DocumentableItem[])
PrefixExists(System.Xml.XmlQualifiedName[],System.String)
TryMatchNamespace(System.Xml.XmlQualifiedName[],System.String,System.String&)
GetPortTypeQName(CoreWCF.Description.ContractDescription)
GetUniqueName(System.String,System.Func`3<System.String,System.Object,System.Boolean>,System.Object)
GetBindingQName(CoreWCF.Description.ServiceEndpoint,CoreWCF.Description.WsdlExporter,System.Boolean&)
WsdlBindingQNameExistsImpl(System.String,System.Object)
WsdlBindingQNameExists(CoreWCF.Description.WsdlExporter,System.String)
GetPortName(CoreWCF.Description.ServiceEndpoint,System.Web.Services.Description.Service)
ServiceContainsPort(System.Web.Services.Description.Service)
GetWsdlOperationName(CoreWCF.Description.OperationDescription)
AddUsingSessionAttributeIfNeeded(System.Web.Services.Description.PortType,CoreWCF.Description.ContractDescription)
AddInitiatingTerminatingAttributesIfNeeded(System.Web.Services.Description.Operation,CoreWCF.Description.OperationDescription,CoreWCF.Description.ContractDescription)
AddInitiatingAttribute(System.Web.Services.Description.Operation,System.Boolean)
AddTerminatingAttribute(System.Web.Services.Description.Operation,System.Boolean)
CloneAndAddToAttributes(System.Xml.XmlAttribute[],System.String,System.String,System.String,System.String)
ToValue(System.Boolean)
CallExtension(CoreWCF.Description.WsdlContractConversionContext,CoreWCF.Description.IWsdlExportExtension)
CallExtension(CoreWCF.Description.WsdlEndpointConversionContext,CoreWCF.Description.IWsdlExportExtension)
ThrowExtensionException(CoreWCF.Description.ContractDescription,CoreWCF.Description.IWsdlExportExtension,System.Exception)
ThrowExtensionException(CoreWCF.Description.ServiceEndpoint,CoreWCF.Description.IWsdlExportExtension,System.Exception)
.ctor(CoreWCF.Description.ContractDescription,CoreWCF.Channels.Binding)
Equals(System.Object)
GetHashCode()
.ctor(CoreWCF.Description.ServiceEndpoint,System.Xml.XmlQualifiedName)
Equals(System.Object)
GetHashCode()