1 //----------------------------------------------------------------------------- 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 //----------------------------------------------------------------------------- 4 5 namespace System.ServiceModel.Description 6 { 7 using System.IO; 8 using System.ServiceModel.Channels; 9 using System.Xml; 10 using System.Collections.Generic; 11 using System.Collections.ObjectModel; 12 using WsdlNS = System.Web.Services.Description; 13 14 public class WsdlEndpointConversionContext 15 { 16 17 readonly ServiceEndpoint endpoint; 18 readonly WsdlNS.Binding wsdlBinding; 19 readonly WsdlNS.Port wsdlPort; 20 readonly WsdlContractConversionContext contractContext; 21 22 readonly Dictionary<OperationDescription, WsdlNS.OperationBinding> wsdlOperationBindings; 23 readonly Dictionary<WsdlNS.OperationBinding, OperationDescription> operationDescriptionBindings; 24 readonly Dictionary<MessageDescription, WsdlNS.MessageBinding> wsdlMessageBindings; 25 readonly Dictionary<FaultDescription, WsdlNS.FaultBinding> wsdlFaultBindings; 26 readonly Dictionary<WsdlNS.MessageBinding, MessageDescription> messageDescriptionBindings; 27 readonly Dictionary<WsdlNS.FaultBinding, FaultDescription> faultDescriptionBindings; 28 WsdlEndpointConversionContext(WsdlContractConversionContext contractContext, ServiceEndpoint endpoint, WsdlNS.Binding wsdlBinding, WsdlNS.Port wsdlport)29 internal WsdlEndpointConversionContext(WsdlContractConversionContext contractContext, ServiceEndpoint endpoint, WsdlNS.Binding wsdlBinding, WsdlNS.Port wsdlport) 30 { 31 32 this.endpoint = endpoint; 33 this.wsdlBinding = wsdlBinding; 34 this.wsdlPort = wsdlport; 35 this.contractContext = contractContext; 36 37 this.wsdlOperationBindings = new Dictionary<OperationDescription, WsdlNS.OperationBinding>(); 38 this.operationDescriptionBindings = new Dictionary<WsdlNS.OperationBinding, OperationDescription>(); 39 this.wsdlMessageBindings = new Dictionary<MessageDescription, WsdlNS.MessageBinding>(); 40 this.messageDescriptionBindings = new Dictionary<WsdlNS.MessageBinding, MessageDescription>(); 41 this.wsdlFaultBindings = new Dictionary<FaultDescription, WsdlNS.FaultBinding>(); 42 this.faultDescriptionBindings = new Dictionary<WsdlNS.FaultBinding, FaultDescription>(); 43 } 44 WsdlEndpointConversionContext(WsdlEndpointConversionContext bindingContext, ServiceEndpoint endpoint, WsdlNS.Port wsdlport)45 internal WsdlEndpointConversionContext(WsdlEndpointConversionContext bindingContext, ServiceEndpoint endpoint, WsdlNS.Port wsdlport) 46 { 47 48 this.endpoint = endpoint; 49 this.wsdlBinding = bindingContext.WsdlBinding; 50 this.wsdlPort = wsdlport; 51 this.contractContext = bindingContext.contractContext; 52 53 this.wsdlOperationBindings = bindingContext.wsdlOperationBindings; 54 this.operationDescriptionBindings = bindingContext.operationDescriptionBindings; 55 this.wsdlMessageBindings = bindingContext.wsdlMessageBindings; 56 this.messageDescriptionBindings = bindingContext.messageDescriptionBindings; 57 this.wsdlFaultBindings = bindingContext.wsdlFaultBindings; 58 this.faultDescriptionBindings = bindingContext.faultDescriptionBindings; 59 } 60 61 internal IEnumerable<IWsdlExportExtension> ExportExtensions 62 { 63 get 64 { 65 foreach (IWsdlExportExtension extension in endpoint.Behaviors.FindAll<IWsdlExportExtension>()) 66 { 67 yield return extension; 68 } 69 70 foreach (IWsdlExportExtension extension in endpoint.Binding.CreateBindingElements().FindAll<IWsdlExportExtension>()) 71 { 72 yield return extension; 73 } 74 75 foreach (IWsdlExportExtension extension in endpoint.Contract.Behaviors.FindAll<IWsdlExportExtension>()) 76 { 77 yield return extension; 78 } 79 80 foreach (OperationDescription operation in endpoint.Contract.Operations) 81 { 82 if (!WsdlExporter.OperationIsExportable(operation)) 83 { 84 continue; 85 } 86 87 // In 3.0SP1, the DCSOB and XSOB were moved from before to after the custom behaviors. For 88 // IWsdlExportExtension compat, run them in the pre-SP1 order. 89 // TEF QFE 367607 90 Collection<IWsdlExportExtension> extensions = operation.Behaviors.FindAll<IWsdlExportExtension>(); 91 for (int i = 0; i < extensions.Count;) 92 { 93 if (WsdlExporter.IsBuiltInOperationBehavior(extensions[i])) 94 { 95 yield return extensions[i]; 96 extensions.RemoveAt(i); 97 } 98 else 99 { 100 i++; 101 } 102 } 103 foreach (IWsdlExportExtension extension in extensions) 104 { 105 yield return extension; 106 } 107 } 108 } 109 } 110 111 public ServiceEndpoint Endpoint { get { return endpoint; } } 112 public WsdlNS.Binding WsdlBinding { get { return wsdlBinding; } } 113 public WsdlNS.Port WsdlPort { get { return wsdlPort; } } 114 public WsdlContractConversionContext ContractConversionContext { get { return contractContext; } } 115 GetOperationBinding(OperationDescription operation)116 public WsdlNS.OperationBinding GetOperationBinding(OperationDescription operation) 117 { 118 return this.wsdlOperationBindings[operation]; 119 } 120 GetMessageBinding(MessageDescription message)121 public WsdlNS.MessageBinding GetMessageBinding(MessageDescription message) 122 { 123 return this.wsdlMessageBindings[message]; 124 } 125 GetFaultBinding(FaultDescription fault)126 public WsdlNS.FaultBinding GetFaultBinding(FaultDescription fault) 127 { 128 return this.wsdlFaultBindings[fault]; 129 } 130 GetOperationDescription(WsdlNS.OperationBinding operationBinding)131 public OperationDescription GetOperationDescription(WsdlNS.OperationBinding operationBinding) 132 { 133 return this.operationDescriptionBindings[operationBinding]; 134 } 135 GetMessageDescription(WsdlNS.MessageBinding messageBinding)136 public MessageDescription GetMessageDescription(WsdlNS.MessageBinding messageBinding) 137 { 138 return this.messageDescriptionBindings[messageBinding]; 139 } 140 GetFaultDescription(WsdlNS.FaultBinding faultBinding)141 public FaultDescription GetFaultDescription(WsdlNS.FaultBinding faultBinding) 142 { 143 return this.faultDescriptionBindings[faultBinding]; 144 } 145 146 // -------------------------------------------------------------------------------------------------- 147 AddOperationBinding(OperationDescription operationDescription, WsdlNS.OperationBinding wsdlOperationBinding)148 internal void AddOperationBinding(OperationDescription operationDescription, WsdlNS.OperationBinding wsdlOperationBinding) 149 { 150 this.wsdlOperationBindings.Add(operationDescription, wsdlOperationBinding); 151 this.operationDescriptionBindings.Add(wsdlOperationBinding, operationDescription); 152 } 153 AddMessageBinding(MessageDescription messageDescription, WsdlNS.MessageBinding wsdlMessageBinding)154 internal void AddMessageBinding(MessageDescription messageDescription, WsdlNS.MessageBinding wsdlMessageBinding) 155 { 156 this.wsdlMessageBindings.Add(messageDescription, wsdlMessageBinding); 157 this.messageDescriptionBindings.Add(wsdlMessageBinding, messageDescription); 158 } 159 AddFaultBinding(FaultDescription faultDescription, WsdlNS.FaultBinding wsdlFaultBinding)160 internal void AddFaultBinding(FaultDescription faultDescription, WsdlNS.FaultBinding wsdlFaultBinding) 161 { 162 this.wsdlFaultBindings.Add(faultDescription, wsdlFaultBinding); 163 this.faultDescriptionBindings.Add(wsdlFaultBinding, faultDescription); 164 } 165 } 166 167 } 168