176 lines
7.5 KiB
C#
176 lines
7.5 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// 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;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|