1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.ServiceModel.Description
{
using System.Xml;
using System.ServiceModel.Channels;
using System.Xml.Schema;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using WsdlNS = System.Web.Services.Description;
// This class is created as part of the export process and passed to
// Wsdlmporter and WsdlExporter implementations as a utility for
// Correlating between the WSDL OM and the Indigo OM
// in the conversion process.
public class WsdlContractConversionContext
{
readonly ContractDescription contract;
readonly WsdlNS.PortType wsdlPortType;
readonly Dictionary<OperationDescription, WsdlNS.Operation> wsdlOperations;
readonly Dictionary<WsdlNS.Operation, OperationDescription> operationDescriptions;
readonly Dictionary<MessageDescription, WsdlNS.OperationMessage> wsdlOperationMessages;
readonly Dictionary<FaultDescription, WsdlNS.OperationFault> wsdlOperationFaults;
readonly Dictionary<WsdlNS.OperationMessage, MessageDescription> messageDescriptions;
readonly Dictionary<WsdlNS.OperationFault, FaultDescription> faultDescriptions;
readonly Dictionary<WsdlNS.Operation, Collection<WsdlNS.OperationBinding>> operationBindings;
internal WsdlContractConversionContext(ContractDescription contract, WsdlNS.PortType wsdlPortType)
{
this.contract = contract;
this.wsdlPortType = wsdlPortType;
this.wsdlOperations = new Dictionary<OperationDescription, WsdlNS.Operation>();
this.operationDescriptions = new Dictionary<WsdlNS.Operation, OperationDescription>();
this.wsdlOperationMessages = new Dictionary<MessageDescription, WsdlNS.OperationMessage>();
this.messageDescriptions = new Dictionary<WsdlNS.OperationMessage, MessageDescription>();
this.wsdlOperationFaults = new Dictionary<FaultDescription, WsdlNS.OperationFault>();
this.faultDescriptions = new Dictionary<WsdlNS.OperationFault, FaultDescription>();
this.operationBindings = new Dictionary<WsdlNS.Operation, Collection<WsdlNS.OperationBinding>>();
}
internal IEnumerable<IWsdlExportExtension> ExportExtensions
{
get
{
foreach (IWsdlExportExtension extension in contract.Behaviors.FindAll<IWsdlExportExtension>())
{
yield return extension;
}
foreach (OperationDescription operation in contract.Operations)
{
if (!WsdlExporter.OperationIsExportable(operation))
{
continue;
}
// In 3.0SP1, the DCSOB and XSOB were moved from before to after the custom behaviors. For
// IWsdlExportExtension compat, run them in the pre-SP1 order.
// TEF QFE 367607
Collection<IWsdlExportExtension> extensions = operation.Behaviors.FindAll<IWsdlExportExtension>();
for (int i = 0; i < extensions.Count; )
{
if (WsdlExporter.IsBuiltInOperationBehavior(extensions[i]))
{
yield return extensions[i];
extensions.RemoveAt(i);
}
else
{
i++;
}
}
foreach (IWsdlExportExtension extension in extensions)
{
yield return extension;
}
}
}
}
public ContractDescription Contract { get { return contract; } }
public WsdlNS.PortType WsdlPortType { get { return wsdlPortType; } }
public WsdlNS.Operation GetOperation(OperationDescription operation)
{
return this.wsdlOperations[operation];
}
public WsdlNS.OperationMessage GetOperationMessage(MessageDescription message)
{
return this.wsdlOperationMessages[message];
}
public WsdlNS.OperationFault GetOperationFault(FaultDescription fault)
{
return this.wsdlOperationFaults[fault];
}
public OperationDescription GetOperationDescription(WsdlNS.Operation operation)
{
return this.operationDescriptions[operation];
}
public MessageDescription GetMessageDescription(WsdlNS.OperationMessage operationMessage)
{
return this.messageDescriptions[operationMessage];
}
public FaultDescription GetFaultDescription(WsdlNS.OperationFault operationFault)
{
return this.faultDescriptions[operationFault];
}
// --------------------------------------------------------------------------------------------------
internal void AddOperation(OperationDescription operationDescription, WsdlNS.Operation wsdlOperation)
{
this.wsdlOperations.Add(operationDescription, wsdlOperation);
this.operationDescriptions.Add(wsdlOperation, operationDescription);
}
internal void AddMessage(MessageDescription messageDescription, WsdlNS.OperationMessage wsdlOperationMessage)
{
this.wsdlOperationMessages.Add(messageDescription, wsdlOperationMessage);
this.messageDescriptions.Add(wsdlOperationMessage, messageDescription);
}
internal void AddFault(FaultDescription faultDescription, WsdlNS.OperationFault wsdlOperationFault)
{
this.wsdlOperationFaults.Add(faultDescription, wsdlOperationFault);
this.faultDescriptions.Add(wsdlOperationFault, faultDescription);
}
internal Collection<WsdlNS.OperationBinding> GetOperationBindings(WsdlNS.Operation operation)
{
Collection<WsdlNS.OperationBinding> bindings;
if (!this.operationBindings.TryGetValue(operation, out bindings))
{
bindings = new Collection<WsdlNS.OperationBinding>();
WsdlNS.ServiceDescriptionCollection wsdlDocuments = WsdlPortType.ServiceDescription.ServiceDescriptions;
foreach (WsdlNS.ServiceDescription wsdl in wsdlDocuments)
{
foreach (WsdlNS.Binding wsdlBinding in wsdl.Bindings)
{
if (wsdlBinding.Type.Name == WsdlPortType.Name && wsdlBinding.Type.Namespace == WsdlPortType.ServiceDescription.TargetNamespace)
{
foreach (WsdlNS.OperationBinding operationBinding in wsdlBinding.Operations)
{
if (WsdlImporter.Binding2DescriptionHelper.Match(operationBinding, operation) != WsdlImporter.Binding2DescriptionHelper.MatchResult.None)
{
bindings.Add(operationBinding);
break;
}
}
}
}
}
this.operationBindings.Add(operation, bindings);
}
return bindings;
}
}
}
|