| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335 |
- //-----------------------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //-----------------------------------------------------------------------------
- namespace System.ServiceModel.Description
- {
- using System;
- using System.Collections.Generic;
- using System.Diagnostics.CodeAnalysis;
- using System.Globalization;
- using System.IO;
- using System.Reflection;
- using System.Runtime;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Dispatcher;
- using System.Xml;
- using System.Xml.Schema;
- using System.Xml.Serialization;
- using WsdlNS = System.Web.Services.Description;
- abstract class MessageContractExporter
- {
- readonly protected WsdlContractConversionContext contractContext;
- readonly protected WsdlExporter exporter;
- readonly protected OperationDescription operation;
- readonly protected IOperationBehavior extension;
- static internal void ExportMessageBinding(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext, Type messageContractExporterType, OperationDescription operation)
- {
- new MessageBindingExporter(exporter, endpointContext).ExportMessageBinding(operation, messageContractExporterType);
- }
- protected abstract object OnExportMessageContract();
- protected abstract void ExportHeaders(int messageIndex, object state);
- protected abstract void ExportBody(int messageIndex, object state);
- protected abstract void ExportKnownTypes();
- protected abstract bool IsRpcStyle();
- protected abstract bool IsEncoded();
- protected abstract object GetExtensionData();
- protected MessageExportContext ExportedMessages
- {
- get { return GetMessageExportContext(exporter); }
- }
- void AddElementToSchema(XmlSchemaElement element, string elementNs, XmlSchemaSet schemaSet)
- {
- OperationDescription parentOperation = this.operation;
- if (parentOperation.OperationMethod != null)
- {
- XmlQualifiedName qname = new XmlQualifiedName(element.Name, elementNs);
- OperationElement existingElement;
- if (ExportedMessages.ElementTypes.TryGetValue(qname, out existingElement))
- {
- if (existingElement.Operation.OperationMethod == parentOperation.OperationMethod)
- return;
- if (!SchemaHelper.IsMatch(element, existingElement.Element))
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CannotHaveTwoOperationsWithTheSameElement5, parentOperation.OperationMethod.DeclaringType, parentOperation.OperationMethod.Name, qname, existingElement.Operation.OperationMethod.DeclaringType, existingElement.Operation.Name)));
- }
- return;
- }
- else
- {
- ExportedMessages.ElementTypes.Add(qname, new OperationElement(element, parentOperation));
- }
- }
- SchemaHelper.AddElementToSchema(element, SchemaHelper.GetSchema(elementNs, schemaSet), schemaSet);
- }
- static MessageExportContext GetMessageExportContext(WsdlExporter exporter)
- {
- object messageExportContext;
- if (!exporter.State.TryGetValue(typeof(MessageExportContext), out messageExportContext))
- {
- messageExportContext = new MessageExportContext();
- exporter.State[typeof(MessageExportContext)] = messageExportContext;
- }
- return (MessageExportContext)messageExportContext;
- }
- protected MessageContractExporter(WsdlExporter exporter, WsdlContractConversionContext context, OperationDescription operation, IOperationBehavior extension)
- {
- this.exporter = exporter;
- this.contractContext = context;
- this.operation = operation;
- this.extension = extension;
- }
- internal void ExportMessageContract()
- {
- if (extension == null)
- return;
- object state = OnExportMessageContract();
- OperationFormatter.Validate(operation, IsRpcStyle(), IsEncoded());
- ExportKnownTypes();
- for (int messageIndex = 0; messageIndex < operation.Messages.Count; messageIndex++)
- ExportMessage(messageIndex, state);
- if (!operation.IsOneWay)
- {
- ExportFaults(state);
- }
- foreach (XmlSchema schema in exporter.GeneratedXmlSchemas.Schemas())
- EnsureXsdImport(schema.TargetNamespace, contractContext.WsdlPortType.ServiceDescription);
- }
- void ExportMessage(int messageIndex, object state)
- {
- try
- {
- MessageDescription description = operation.Messages[messageIndex];
- WsdlNS.Message wsdlMessage;
- if (CreateMessage(description, messageIndex, out wsdlMessage))
- {
- if (description.IsUntypedMessage)
- {
- ExportAnyMessage(wsdlMessage, description.Body.ReturnValue ?? description.Body.Parts[0]);
- return;
- }
- bool isRequest = (messageIndex == 0);
- StreamFormatter streamFormatter = StreamFormatter.Create(description, operation.Name, isRequest);
- if (streamFormatter != null)
- {
- ExportStreamBody(wsdlMessage, streamFormatter.WrapperName, streamFormatter.WrapperNamespace, streamFormatter.PartName, streamFormatter.PartNamespace, IsRpcStyle(), false /*IsOperationInherited(operation)*/);
- }
- else
- {
- ExportBody(messageIndex, state);
- }
- }
- if (!description.IsUntypedMessage)
- {
- ExportHeaders(messageIndex, state);
- }
- }
- finally
- {
- Compile();
- }
- }
- protected virtual void ExportFaults(object state)
- {
- foreach (FaultDescription fault in operation.Faults)
- {
- ExportFault(fault);
- }
- }
- protected bool IsOperationInherited()
- {
- return operation.DeclaringContract != contractContext.Contract;
- }
- void ExportAnyMessage(WsdlNS.Message message, MessagePartDescription part)
- {
- XmlSchemaSet schemas = this.exporter.GeneratedXmlSchemas;
- XmlSchema schema = SchemaHelper.GetSchema(DataContractSerializerMessageContractImporter.GenericMessageTypeName.Namespace, schemas);
- if (!schema.SchemaTypes.Contains(DataContractSerializerMessageContractImporter.GenericMessageTypeName))
- {
- XmlSchemaComplexType genericMessageType = new XmlSchemaComplexType();
- genericMessageType.Name = DataContractSerializerMessageContractImporter.GenericMessageTypeName.Name;
- XmlSchemaSequence bodySequence = new XmlSchemaSequence();
- genericMessageType.Particle = bodySequence;
- XmlSchemaAny anyElement = new XmlSchemaAny();
- anyElement.MinOccurs = 0;
- anyElement.MaxOccurs = decimal.MaxValue;
- anyElement.Namespace = "##any";
- bodySequence.Items.Add(anyElement);
- SchemaHelper.AddTypeToSchema(genericMessageType, schema, schemas);
- }
- string partName = string.IsNullOrEmpty(part.UniquePartName) ? part.Name : part.UniquePartName;
- WsdlNS.MessagePart wsdlPart = AddMessagePart(message, partName, XmlQualifiedName.Empty, DataContractSerializerMessageContractImporter.GenericMessageTypeName);
- part.UniquePartName = wsdlPart.Name;
- }
- protected void ExportStreamBody(WsdlNS.Message message, string wrapperName, string wrapperNs, string partName, string partNs, bool isRpc, bool skipSchemaExport)
- {
- XmlSchemaSet schemas = this.exporter.GeneratedXmlSchemas;
- XmlSchema schema = SchemaHelper.GetSchema(DataContractSerializerMessageContractImporter.StreamBodyTypeName.Namespace, schemas);
- if (!schema.SchemaTypes.Contains(DataContractSerializerMessageContractImporter.StreamBodyTypeName))
- {
- XmlSchemaSimpleType streamBodyType = new XmlSchemaSimpleType();
- streamBodyType.Name = DataContractSerializerMessageContractImporter.StreamBodyTypeName.Name;
- XmlSchemaSimpleTypeRestriction contentRestriction = new XmlSchemaSimpleTypeRestriction();
- contentRestriction.BaseTypeName = XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Base64Binary).QualifiedName;
- streamBodyType.Content = contentRestriction;
- SchemaHelper.AddTypeToSchema(streamBodyType, schema, schemas);
- }
- XmlSchemaSequence wrapperSequence = null;
- if (!isRpc && wrapperName != null)
- wrapperSequence = ExportWrappedPart(message, wrapperName, wrapperNs, schemas, skipSchemaExport);
- MessagePartDescription streamPart = new MessagePartDescription(partName, partNs);
- ExportMessagePart(message, streamPart, DataContractSerializerMessageContractImporter.StreamBodyTypeName, null/*xsdType*/, false/*isOptional*/, false/*isNillable*/, skipSchemaExport, !isRpc, wrapperNs, wrapperSequence, schemas);
- }
- void ExportFault(FaultDescription fault)
- {
- WsdlNS.Message faultMessage = new WsdlNS.Message();
- faultMessage.Name = GetFaultMessageName(fault.Name);
- XmlQualifiedName elementName = ExportFaultElement(fault);
- this.contractContext.WsdlPortType.ServiceDescription.Messages.Add(faultMessage);
- AddMessagePart(faultMessage, "detail", elementName, null);
- // create a wsdl:fault to put inside the wsdl:portType/wsdl:operation
- WsdlNS.OperationFault operationFault = contractContext.GetOperationFault(fault);
- WsdlExporter.WSAddressingHelper.AddActionAttribute(fault.Action, operationFault, this.exporter.PolicyVersion);
- operationFault.Message = new XmlQualifiedName(faultMessage.Name, faultMessage.ServiceDescription.TargetNamespace);
- }
- XmlQualifiedName ExportFaultElement(FaultDescription fault)
- {
- XmlSchemaType xsdType;
- XmlQualifiedName typeName = ExportType(fault.DetailType, fault.Name, operation.Name, out xsdType);
- XmlQualifiedName elementName;
- if (XmlName.IsNullOrEmpty(fault.ElementName))
- {
- elementName = DataContractExporter.GetRootElementName(fault.DetailType);
- if (elementName == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxFaultTypeAnonymous, operation.Name, fault.DetailType.FullName)));
- }
- else
- elementName = new XmlQualifiedName(fault.ElementName.EncodedName, fault.Namespace);
- ExportGlobalElement(elementName.Name, elementName.Namespace, true/*isNillable*/, typeName, xsdType, this.exporter.GeneratedXmlSchemas);
- return elementName;
- }
- protected XsdDataContractExporter DataContractExporter
- {
- get
- {
- object dataContractExporter;
- if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter), out dataContractExporter))
- {
- dataContractExporter = new XsdDataContractExporter(this.exporter.GeneratedXmlSchemas);
- exporter.State.Add(typeof(XsdDataContractExporter), dataContractExporter);
- }
- return (XsdDataContractExporter)dataContractExporter;
- }
- }
- protected XmlQualifiedName ExportType(Type type, string partName, string operationName, out XmlSchemaType xsdType)
- {
- xsdType = null;
- if (type == null)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxExportMustHaveType, operationName, partName)));
- if (type == typeof(void))
- return null;
- DataContractExporter.Export(type);
- XmlQualifiedName typeName = DataContractExporter.GetSchemaTypeName(type);
- if (IsNullOrEmpty(typeName))
- xsdType = DataContractExporter.GetSchemaType(type);
- return typeName;
- }
- protected XmlSchemaSet SchemaSet
- {
- get
- {
- return exporter.GeneratedXmlSchemas;
- }
- }
- static protected WsdlNS.MessagePart AddMessagePart(WsdlNS.Message message, string partName, XmlQualifiedName elementName, XmlQualifiedName typeName)
- {
- if (message.Parts[partName] != null)
- {
- if (IsNullOrEmpty(elementName))
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SFxPartNameMustBeUniqueInRpc, partName)));
- int i = 1;
- while (message.Parts[partName + i] != null)
- {
- if (i == Int32.MaxValue)
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SFxTooManyPartsWithSameName, partName)));
- i++;
- }
- partName = partName + i.ToString(CultureInfo.InvariantCulture);
- }
- WsdlNS.MessagePart part = new WsdlNS.MessagePart();
- part.Name = partName;
- part.Element = elementName;
- part.Type = typeName;
- message.Parts.Add(part);
- EnsureXsdImport(IsNullOrEmpty(elementName) ? typeName.Namespace : elementName.Namespace, message.ServiceDescription);
- return part;
- }
- static void EnsureXsdImport(string ns, WsdlNS.ServiceDescription wsdl)
- {
- string refNs = wsdl.TargetNamespace;
- if (!refNs.EndsWith("/", StringComparison.Ordinal))
- refNs = refNs + "/Imports";
- else
- refNs += "Imports";
- if (refNs == ns)
- refNs = wsdl.TargetNamespace;
- XmlSchema xsd = GetContainedSchema(wsdl, refNs);
- if (xsd != null)
- {
- foreach (object include in xsd.Includes)
- {
- XmlSchemaImport import = include as XmlSchemaImport;
- if (import != null && SchemaHelper.NamespacesEqual(import.Namespace, ns))
- return;
- }
- }
- else
- {
- xsd = new XmlSchema();
- xsd.TargetNamespace = refNs;
- wsdl.Types.Schemas.Add(xsd);
- }
- XmlSchemaImport imp = new XmlSchemaImport();
- if (ns != null && ns.Length > 0)
- imp.Namespace = ns;
- xsd.Includes.Add(imp);
- }
- static XmlSchema GetContainedSchema(WsdlNS.ServiceDescription wsdl, string ns)
- {
- foreach (XmlSchema xsd in wsdl.Types.Schemas)
- if (SchemaHelper.NamespacesEqual(xsd.TargetNamespace, ns))
- return xsd;
- return null;
- }
- static protected bool IsNullOrEmpty(XmlQualifiedName qname)
- {
- return qname == null || qname.IsEmpty;
- }
- protected void ExportGlobalElement(string elementName, string elementNs, bool isNillable, XmlQualifiedName typeName, XmlSchemaType xsdType, XmlSchemaSet schemaSet)
- {
- #if DEBUG
- Fx.Assert(NamingHelper.IsValidNCName(elementName), "Name value has to be a valid NCName.");
- if (xsdType == null)
- Fx.Assert(NamingHelper.IsValidNCName(typeName.Name), "Name value has to be a valid NCName.");
- #endif
- XmlSchemaElement element = new XmlSchemaElement();
- element.Name = elementName;
- if (xsdType != null)
- element.SchemaType = xsdType;
- else
- element.SchemaTypeName = typeName;
- element.IsNillable = isNillable;
- AddElementToSchema(element, elementNs, schemaSet);
- }
- void ExportLocalElement(string wrapperNs, string elementName, string elementNs, XmlQualifiedName typeName, XmlSchemaType xsdType, bool multiple, bool isOptional, bool isNillable, XmlSchemaSequence sequence, XmlSchemaSet schemaSet)
- {
- #if DEBUG
- Fx.Assert(NamingHelper.IsValidNCName(elementName), "Name value has to be a valid NCName.");
- if (xsdType == null)
- Fx.Assert(NamingHelper.IsValidNCName(typeName.Name), "Name value has to be a valid NCName.");
- #endif
- XmlSchema schema = SchemaHelper.GetSchema(wrapperNs, schemaSet);
- XmlSchemaElement element = new XmlSchemaElement();
- if (elementNs == wrapperNs)
- {
- element.Name = elementName;
- if (xsdType != null)
- element.SchemaType = xsdType;
- else
- {
- element.SchemaTypeName = typeName;
- SchemaHelper.AddImportToSchema(element.SchemaTypeName.Namespace, schema);
- }
- SchemaHelper.AddElementForm(element, schema);
- element.IsNillable = isNillable;
- }
- else
- {
- element.RefName = new XmlQualifiedName(elementName, elementNs);
- SchemaHelper.AddImportToSchema(elementNs, schema);
- ExportGlobalElement(elementName, elementNs, isNillable, typeName, xsdType, schemaSet);
- }
- if (multiple)
- element.MaxOccurs = Decimal.MaxValue;
- if (isOptional)
- element.MinOccurs = 0;
- sequence.Items.Add(element);
- }
- static readonly XmlSchemaSequence emptySequence = new XmlSchemaSequence();
- protected XmlSchemaSequence ExportWrappedPart(WsdlNS.Message message, string elementName, string elementNs, XmlSchemaSet schemaSet, bool skipSchemaExport)
- {
- #if DEBUG
- Fx.Assert(NamingHelper.IsValidNCName(elementName), "Name value has to be a valid NCName.");
- #endif
- AddMessagePart(message, "parameters", new XmlQualifiedName(elementName, elementNs), XmlQualifiedName.Empty);
- if (skipSchemaExport)
- return emptySequence; //return empty to denote it is wrapped part
- XmlSchemaElement wrapperGlobalElement = new XmlSchemaElement();
- wrapperGlobalElement.Name = elementName;
- XmlSchemaComplexType wrapperType = new XmlSchemaComplexType();
- wrapperGlobalElement.SchemaType = wrapperType; // generating an anonymous type for wrapper
- XmlSchemaSequence rootSequence = new XmlSchemaSequence();
- wrapperType.Particle = rootSequence;
- AddElementToSchema(wrapperGlobalElement, elementNs, schemaSet);
- return rootSequence;
- }
- protected bool CreateMessage(MessageDescription message, int messageIndex, out WsdlNS.Message wsdlMessage)
- {
- wsdlMessage = null;
- bool isNewMessage = true;
- if (ExportedMessages.WsdlMessages.ContainsKey(new MessageDescriptionDictionaryKey(contractContext.Contract, message)))
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.MultipleCallsToExportContractWithSameContract)));
- TypedMessageKey typedMessageKey = null;
- OperationMessageKey messageKey = null;
- if (message.IsTypedMessage)
- {
- typedMessageKey = new TypedMessageKey(message.MessageType, operation.DeclaringContract.Namespace, this.GetExtensionData());
- if (ExportedMessages.TypedMessages.TryGetValue(typedMessageKey, out wsdlMessage))
- isNewMessage = false;
- }
- else if (operation.OperationMethod != null)
- {
- messageKey = new OperationMessageKey(operation, messageIndex);
- if (ExportedMessages.ParameterMessages.TryGetValue(messageKey, out wsdlMessage))
- isNewMessage = false;
- }
- WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
- if (isNewMessage)
- {
- wsdlMessage = new WsdlNS.Message();
- wsdlMessage.Name = GetMessageName(message);
- wsdl.Messages.Add(wsdlMessage);
- if (message.IsTypedMessage)
- ExportedMessages.TypedMessages.Add(typedMessageKey, wsdlMessage);
- else if (messageKey != null)
- ExportedMessages.ParameterMessages.Add(messageKey, wsdlMessage);
- }
- //Add Name to OperationMessage
- WsdlNS.OperationMessage wsdlOperationMessage = contractContext.GetOperationMessage(message);
- wsdlOperationMessage.Message = new XmlQualifiedName(wsdlMessage.Name, wsdlMessage.ServiceDescription.TargetNamespace);
- this.ExportedMessages.WsdlMessages.Add(new MessageDescriptionDictionaryKey(contractContext.Contract, message), wsdlMessage);
- return isNewMessage;
- }
- protected bool CreateHeaderMessage(MessageDescription message, out WsdlNS.Message wsdlMessage)
- {
- wsdlMessage = null;
- if (ExportedMessages.WsdlHeaderMessages.ContainsKey(new MessageDescriptionDictionaryKey(contractContext.Contract, message)))
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.MultipleCallsToExportContractWithSameContract)));
- TypedMessageKey typedMessageKey = null;
- if (message.IsTypedMessage)
- {
- typedMessageKey = new TypedMessageKey(message.MessageType, operation.DeclaringContract.Namespace, GetExtensionData());
- if (ExportedMessages.TypedHeaderMessages.TryGetValue(typedMessageKey, out wsdlMessage))
- {
- this.ExportedMessages.WsdlHeaderMessages.Add(new MessageDescriptionDictionaryKey(contractContext.Contract, message), wsdlMessage);
- return false;
- }
- }
- string messageName = GetHeaderMessageName(message);
- wsdlMessage = new WsdlNS.Message();
- wsdlMessage.Name = messageName;
- contractContext.WsdlPortType.ServiceDescription.Messages.Add(wsdlMessage);
- if (message.IsTypedMessage)
- ExportedMessages.TypedHeaderMessages.Add(typedMessageKey, wsdlMessage);
- this.ExportedMessages.WsdlHeaderMessages.Add(new MessageDescriptionDictionaryKey(contractContext.Contract, message), wsdlMessage);
- return true;
- }
- string GetMessageName(MessageDescription messageDescription)
- {
- string messageNameBase = XmlName.IsNullOrEmpty(messageDescription.MessageName) ? null : messageDescription.MessageName.EncodedName;
- //If there wasn't one in the Message Description we create one.
- if (string.IsNullOrEmpty(messageNameBase))
- {
- string portTypeName = contractContext.WsdlPortType.Name;
- string operationName = contractContext.GetOperation(operation).Name;
- string callbackString = operation.IsServerInitiated() ? "Callback" : string.Empty;
- // [....]: composing names have potential problem of generating name that looks like an encoded name, consider avoiding '_'
- if (messageDescription.Direction == MessageDirection.Input)
- messageNameBase = string.Format(System.Globalization.CultureInfo.InvariantCulture,
- "{0}_{1}_Input{2}Message", portTypeName, operationName, callbackString);
- else
- messageNameBase = string.Format(System.Globalization.CultureInfo.InvariantCulture,
- "{0}_{1}_Output{2}Message", portTypeName, operationName, callbackString);
- }
- WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
- return GetUniqueMessageName(wsdl, messageNameBase);
- }
- string GetHeaderMessageName(MessageDescription messageDescription)
- {
- WsdlNS.Message wsdlBodyMessage = this.ExportedMessages.WsdlMessages[new MessageDescriptionDictionaryKey(this.contractContext.Contract, messageDescription)];
- string messageNameBase = string.Format(System.Globalization.CultureInfo.InvariantCulture,
- "{0}_Headers", wsdlBodyMessage.Name);
- WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
- return GetUniqueMessageName(wsdl, messageNameBase);
- }
- protected string GetFaultMessageName(string faultName)
- {
- string portTypeName = contractContext.WsdlPortType.Name;
- string operationName = contractContext.GetOperation(operation).Name;
- // [....]: composing names have potential problem of generating name that looks like an encoded name, consider avoiding '_'
- string faultNameBase = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}_{1}_{2}_FaultMessage", portTypeName, operationName, faultName);
- WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
- return GetUniqueMessageName(wsdl, faultNameBase);
- }
- static bool DoesMessageNameExist(string messageName, object wsdlObject)
- {
- return ((WsdlNS.ServiceDescription)wsdlObject).Messages[messageName] != null;
- }
- string GetUniqueMessageName(WsdlNS.ServiceDescription wsdl, string messageNameBase)
- {
- return NamingHelper.GetUniqueName(messageNameBase, DoesMessageNameExist, wsdl);
- }
- protected void ExportMessagePart(WsdlNS.Message message, MessagePartDescription part, XmlQualifiedName typeName, XmlSchemaType xsdType, bool isOptional, bool isNillable, bool skipSchemaExport, bool generateElement, string wrapperNs, XmlSchemaSequence wrapperSequence, XmlSchemaSet schemaSet)
- {
- if (IsNullOrEmpty(typeName) && xsdType == null)
- return;
- #if DEBUG
- if (xsdType == null)
- Fx.Assert(NamingHelper.IsValidNCName(typeName.Name), "Name value has to be a valid NCName.");
- #endif
- string elementName = part.Name;
- string partName = string.IsNullOrEmpty(part.UniquePartName) ? elementName : part.UniquePartName;
- WsdlNS.MessagePart wsdlPart = null;
- if (generateElement)
- {
- if (wrapperSequence != null)
- {
- if (!skipSchemaExport)
- ExportLocalElement(wrapperNs, partName, part.Namespace, typeName, xsdType, part.Multiple, isOptional, isNillable, wrapperSequence, schemaSet);
- }
- else
- {
- if (!skipSchemaExport)
- ExportGlobalElement(elementName, part.Namespace, isNillable, typeName, xsdType, schemaSet);
- wsdlPart = AddMessagePart(message, partName, new XmlQualifiedName(elementName, part.Namespace), XmlQualifiedName.Empty);
- }
- }
- else
- {
- if (String.IsNullOrEmpty(typeName.Name))
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxAnonymousTypeNotSupported, message.Name, partName)));
- wsdlPart = AddMessagePart(message, partName, XmlQualifiedName.Empty, typeName);
- }
- if (wsdlPart != null)
- {
- part.UniquePartName = wsdlPart.Name;
- }
- }
- protected void AddParameterOrder(MessageDescription message)
- {
- if (operation == null)
- return;
- WsdlNS.Operation wsdlOperation = contractContext.GetOperation(operation);
- if (wsdlOperation != null)
- {
- if (wsdlOperation.ParameterOrder == null)
- {
- wsdlOperation.ParameterOrder = new string[GetParameterCount()];
- }
- if (wsdlOperation.ParameterOrder.Length == 0)
- return;
- foreach (MessagePartDescription part in message.Body.Parts)
- {
- ParameterInfo paramInfo = part.AdditionalAttributesProvider as ParameterInfo;
- if (paramInfo != null && paramInfo.Position >= 0)
- wsdlOperation.ParameterOrder[paramInfo.Position] = part.Name;
- }
- }
- }
- int GetParameterCount()
- {
- int count = -1;
- foreach (MessageDescription message in operation.Messages)
- {
- foreach (MessagePartDescription part in message.Body.Parts)
- {
- ParameterInfo paramInfo = part.AdditionalAttributesProvider as ParameterInfo;
- if (paramInfo == null)
- return 0;
- if (count < paramInfo.Position)
- count = paramInfo.Position;
- }
- }
- return count + 1;
- }
- protected virtual void Compile()
- {
- foreach (XmlSchema schema in SchemaSet.Schemas())
- SchemaSet.Reprocess(schema);
- SchemaHelper.Compile(SchemaSet, exporter.Errors);
- }
- class MessageBindingExporter
- {
- WsdlEndpointConversionContext endpointContext;
- MessageExportContext exportedMessages;
- EnvelopeVersion soapVersion;
- WsdlExporter exporter;
- internal MessageBindingExporter(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext)
- {
- this.endpointContext = endpointContext;
- this.exportedMessages = (MessageExportContext)exporter.State[typeof(MessageExportContext)];
- this.soapVersion = SoapHelper.GetSoapVersion(endpointContext.WsdlBinding);
- this.exporter = exporter;
- }
- internal void ExportMessageBinding(OperationDescription operation, Type messageContractExporterType)
- {
- WsdlNS.OperationBinding wsdlOperationBinding = endpointContext.GetOperationBinding(operation);
- bool isRpc, isEncoded;
- if (!GetStyleAndUse(operation, messageContractExporterType, out isRpc, out isEncoded))
- return;
- WsdlNS.SoapOperationBinding soapOperationBinding = SoapHelper.GetOrCreateSoapOperationBinding(endpointContext, operation, exporter);
- if (soapOperationBinding == null)
- return;
- soapOperationBinding.Style = isRpc ? WsdlNS.SoapBindingStyle.Rpc : WsdlNS.SoapBindingStyle.Document;
- if (isRpc)
- {
- WsdlNS.SoapBinding soapBinding = (WsdlNS.SoapBinding)endpointContext.WsdlBinding.Extensions.Find(typeof(WsdlNS.SoapBinding));
- soapBinding.Style = soapOperationBinding.Style;
- }
- soapOperationBinding.SoapAction = operation.Messages[0].Action;
- foreach (MessageDescription message in operation.Messages)
- {
- WsdlNS.MessageBinding wsdlMessageBinding = endpointContext.GetMessageBinding(message);
- WsdlNS.Message headerMessage;
- if (this.exportedMessages.WsdlHeaderMessages.TryGetValue(new MessageDescriptionDictionaryKey(this.endpointContext.Endpoint.Contract, message), out headerMessage))
- {
- XmlQualifiedName wsdlHeaderMessageName = new XmlQualifiedName(headerMessage.Name, headerMessage.ServiceDescription.TargetNamespace);
- foreach (MessageHeaderDescription header in message.Headers)
- {
- if (header.IsUnknownHeaderCollection)
- continue;
- ExportMessageHeaderBinding(header, wsdlHeaderMessageName, isEncoded, wsdlMessageBinding);
- }
- }
- ExportMessageBodyBinding(message, isRpc, isEncoded, wsdlMessageBinding);
- }
- foreach (FaultDescription fault in operation.Faults)
- {
- ExportFaultBinding(fault, isEncoded, wsdlOperationBinding);
- }
- }
- void ExportFaultBinding(FaultDescription fault, bool isEncoded, WsdlNS.OperationBinding operationBinding)
- {
- SoapHelper.CreateSoapFaultBinding(fault.Name, endpointContext, endpointContext.GetFaultBinding(fault), isEncoded);
- }
- void ExportMessageBodyBinding(MessageDescription messageDescription, bool isRpc, bool isEncoded, WsdlNS.MessageBinding messageBinding)
- {
- WsdlNS.SoapBodyBinding bodyBinding = SoapHelper.GetOrCreateSoapBodyBinding(endpointContext, messageBinding, exporter);
- if (bodyBinding == null)
- return;
- bodyBinding.Use = isEncoded ? WsdlNS.SoapBindingUse.Encoded : WsdlNS.SoapBindingUse.Literal;
- if (isRpc)
- {
- string ns;
- if (!ExportedMessages.WrapperNamespaces.TryGetValue(new MessageDescriptionDictionaryKey(endpointContext.ContractConversionContext.Contract, messageDescription), out ns))
- ns = messageDescription.Body.WrapperNamespace;
- bodyBinding.Namespace = ns;
- }
- if (isEncoded)
- bodyBinding.Encoding = XmlSerializerOperationFormatter.GetEncoding(soapVersion);
- }
- void ExportMessageHeaderBinding(MessageHeaderDescription header, XmlQualifiedName messageName, bool isEncoded, WsdlNS.MessageBinding messageBinding)
- {
- #if DEBUG
- Fx.Assert(NamingHelper.IsValidNCName(messageName.Name), "Name value has to be a valid NCName.");
- #endif
- WsdlNS.SoapHeaderBinding headerBinding = SoapHelper.CreateSoapHeaderBinding(endpointContext, messageBinding);
- headerBinding.Part = string.IsNullOrEmpty(header.UniquePartName) ? header.Name : header.UniquePartName;
- headerBinding.Message = messageName;
- headerBinding.Use = isEncoded ? WsdlNS.SoapBindingUse.Encoded : WsdlNS.SoapBindingUse.Literal;
- if (isEncoded)
- headerBinding.Encoding = XmlSerializerOperationFormatter.GetEncoding(soapVersion);
- }
- static bool GetStyleAndUse(OperationDescription operation, Type messageContractExporterType, out bool isRpc, out bool isEncoded)
- {
- isRpc = isEncoded = false;
- if (messageContractExporterType == typeof(DataContractSerializerMessageContractExporter) || messageContractExporterType == null)
- {
- DataContractSerializerOperationBehavior dataContractSerializerBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();
- if (dataContractSerializerBehavior != null)
- {
- isRpc = dataContractSerializerBehavior.DataContractFormatAttribute.Style == OperationFormatStyle.Rpc;
- isEncoded = false;
- return true;
- }
- if (messageContractExporterType == typeof(DataContractSerializerMessageContractExporter))
- return false;
- }
- if (messageContractExporterType == typeof(XmlSerializerMessageContractExporter) || messageContractExporterType == null)
- {
- XmlSerializerOperationBehavior xmlSerializerBehavior = operation.Behaviors.Find<XmlSerializerOperationBehavior>();
- if (xmlSerializerBehavior != null)
- {
- isRpc = xmlSerializerBehavior.XmlSerializerFormatAttribute.Style == OperationFormatStyle.Rpc;
- isEncoded = xmlSerializerBehavior.XmlSerializerFormatAttribute.IsEncoded;
- return true;
- }
- return false;
- }
- return false;
- }
- MessageExportContext ExportedMessages
- {
- get { return GetMessageExportContext(exporter); }
- }
- }
- protected class MessageExportContext
- {
- readonly internal Dictionary<MessageDescriptionDictionaryKey, WsdlNS.Message> WsdlMessages = new Dictionary<MessageDescriptionDictionaryKey, System.Web.Services.Description.Message>();
- readonly internal Dictionary<MessageDescriptionDictionaryKey, WsdlNS.Message> WsdlHeaderMessages = new Dictionary<MessageDescriptionDictionaryKey, System.Web.Services.Description.Message>();
- readonly internal Dictionary<MessageDescriptionDictionaryKey, string> WrapperNamespaces = new Dictionary<MessageDescriptionDictionaryKey, string>();
- readonly internal Dictionary<TypedMessageKey, WsdlNS.Message> TypedMessages = new Dictionary<TypedMessageKey, WsdlNS.Message>();
- readonly internal Dictionary<TypedMessageKey, WsdlNS.Message> TypedHeaderMessages = new Dictionary<TypedMessageKey, WsdlNS.Message>();
- readonly internal Dictionary<OperationMessageKey, WsdlNS.Message> ParameterMessages = new Dictionary<OperationMessageKey, WsdlNS.Message>();
- readonly internal Dictionary<XmlQualifiedName, OperationElement> ElementTypes = new Dictionary<XmlQualifiedName, OperationElement>();
- }
- protected sealed class MessageDescriptionDictionaryKey
- {
- public readonly ContractDescription Contract;
- public readonly MessageDescription MessageDescription;
- public MessageDescriptionDictionaryKey(ContractDescription contract, MessageDescription MessageDescription)
- {
- this.Contract = contract;
- this.MessageDescription = MessageDescription;
- }
- public override bool Equals(object obj)
- {
- MessageDescriptionDictionaryKey key = obj as MessageDescriptionDictionaryKey;
- if (key != null && key.MessageDescription == this.MessageDescription && key.Contract == this.Contract)
- return true;
- return false;
- }
- public override int GetHashCode()
- {
- return this.Contract.GetHashCode() ^ this.MessageDescription.GetHashCode();
- }
- }
- internal sealed class TypedMessageKey
- {
- Type type;
- string contractNS;
- object extensionData;
- public TypedMessageKey(Type type, string contractNS, object extensionData)
- {
- this.type = type;
- this.contractNS = contractNS;
- this.extensionData = extensionData;
- }
- public override bool Equals(object obj)
- {
- TypedMessageKey key = obj as TypedMessageKey;
- if (key != null && key.type == this.type &&
- key.contractNS == this.contractNS &&
- key.extensionData.Equals(this.extensionData))
- return true;
- return false;
- }
- [SuppressMessage(FxCop.Category.Usage, "CA2303:FlagTypeGetHashCode", Justification = "The hashcode is not used for identity purposes for embedded types.")]
- public override int GetHashCode()
- {
- return type.GetHashCode();
- }
- }
- internal sealed class OperationMessageKey
- {
- MethodInfo methodInfo;
- int messageIndex;
- ContractDescription declaringContract;
- public OperationMessageKey(OperationDescription operation, int messageIndex)
- {
- this.methodInfo = operation.OperationMethod;
- this.messageIndex = messageIndex;
- this.declaringContract = operation.DeclaringContract;
- }
- public override bool Equals(object obj)
- {
- OperationMessageKey key = obj as OperationMessageKey;
- if (key != null && key.methodInfo == this.methodInfo &&
- key.messageIndex == this.messageIndex &&
- key.declaringContract.Name == this.declaringContract.Name &&
- key.declaringContract.Namespace == this.declaringContract.Namespace)
- return true;
- return false;
- }
- public override int GetHashCode()
- {
- return methodInfo.GetHashCode() ^ messageIndex;
- }
- }
- internal sealed class OperationElement
- {
- XmlSchemaElement element;
- OperationDescription operation;
- internal OperationElement(XmlSchemaElement element, OperationDescription operation)
- {
- this.element = element;
- this.operation = operation;
- }
- internal XmlSchemaElement Element { get { return element; } }
- internal OperationDescription Operation { get { return operation; } }
- }
- }
- class DataContractSerializerMessageContractExporter : MessageContractExporter
- {
- internal DataContractSerializerMessageContractExporter(WsdlExporter exporter, WsdlContractConversionContext context, OperationDescription operation, IOperationBehavior extension)
- : base(exporter, context, operation, extension)
- {
- }
- protected override void Compile()
- {
- XmlSchema wsdl = StockSchemas.CreateWsdl();
- XmlSchema soap = StockSchemas.CreateSoap();
- XmlSchema soapEncoding = StockSchemas.CreateSoapEncoding();
- XmlSchema fakeXsdSchema = StockSchemas.CreateFakeXsdSchema();
- SchemaSet.Add(wsdl);
- SchemaSet.Add(soap);
- SchemaSet.Add(soapEncoding);
- SchemaSet.Add(fakeXsdSchema);
- base.Compile();
- SchemaSet.Remove(wsdl);
- SchemaSet.Remove(soap);
- SchemaSet.Remove(soapEncoding);
- SchemaSet.Remove(fakeXsdSchema);
- }
- protected override bool IsRpcStyle()
- {
- return ((DataContractSerializerOperationBehavior)extension).DataContractFormatAttribute.Style == OperationFormatStyle.Rpc;
- }
- protected override bool IsEncoded()
- {
- return false;
- }
- protected override object OnExportMessageContract()
- {
- return null;
- }
- protected override void ExportHeaders(int messageIndex, object state)
- {
- MessageDescription description = operation.Messages[messageIndex];
- if (description.Headers.Count > 0)
- {
- WsdlNS.Message wsdlMessage;
- if (CreateHeaderMessage(description, out wsdlMessage))
- {
- foreach (MessageHeaderDescription header in description.Headers)
- {
- if (header.IsUnknownHeaderCollection)
- continue;
- XmlSchemaType xsdType;
- bool isQueryable;
- Type dataContractType = DataContractSerializerOperationFormatter.GetSubstituteDataContractType(header.Type, out isQueryable);
- XmlQualifiedName typeName = ExportType(dataContractType, header.Name, operation.Name, out xsdType);
- ExportMessagePart(wsdlMessage, header, typeName, xsdType, true/*isOptional*/, IsTypeNullable(header.Type), false/*IsOperationInherited(operation)*/, true /*generateElement*/, null/*wrapperNamespace*/, null/*wrapperSequence*/, SchemaSet);
- }
- }
- }
- }
- static internal bool IsTypeNullable(Type type)
- {
- return !type.IsValueType ||
- (type.IsGenericType &&
- type.GetGenericTypeDefinition() == typeof(Nullable<>));
- }
- protected override void ExportBody(int messageIndex, object state)
- {
- MessageDescription description = operation.Messages[messageIndex];
- WsdlNS.Message wsdlMessage = this.ExportedMessages.WsdlMessages[new MessageDescriptionDictionaryKey(this.contractContext.Contract, description)];
- DataContractFormatAttribute dataContractFormatAttribute = ((DataContractSerializerOperationBehavior)extension).DataContractFormatAttribute;
- XmlSchemaSequence wrapperSequence = null;
- bool isWrapped = description.Body.WrapperName != null;
- //bool isOperationInherited = IsOperationInherited(operation);
- if (dataContractFormatAttribute.Style == OperationFormatStyle.Document && isWrapped)
- wrapperSequence = ExportWrappedPart(wsdlMessage, description.Body.WrapperName, description.Body.WrapperNamespace, SchemaSet, false /*isOperationInherited*/);
- XmlSchemaType xsdType;
- if (OperationFormatter.IsValidReturnValue(description.Body.ReturnValue))
- {
- bool isQueryable;
- Type dataContractType = DataContractSerializerOperationFormatter.GetSubstituteDataContractType(description.Body.ReturnValue.Type, out isQueryable);
- XmlQualifiedName typeName = ExportType(dataContractType, description.Body.ReturnValue.Name, operation.Name, out xsdType);
- ExportMessagePart(wsdlMessage, description.Body.ReturnValue, typeName, xsdType, true/*isOptional*/, IsTypeNullable(description.Body.ReturnValue.Type), false/*isOperationInherited*/, dataContractFormatAttribute.Style != OperationFormatStyle.Rpc, description.Body.WrapperNamespace, wrapperSequence, SchemaSet);
- }
- foreach (MessagePartDescription bodyPart in description.Body.Parts)
- {
- bool isQueryable;
- Type dataContractType = DataContractSerializerOperationFormatter.GetSubstituteDataContractType(bodyPart.Type, out isQueryable);
- XmlQualifiedName typeName = ExportType(dataContractType, bodyPart.Name, operation.Name, out xsdType);
- ExportMessagePart(wsdlMessage, bodyPart, typeName, xsdType, true/*isOptional*/, IsTypeNullable(bodyPart.Type), false/*isOperationInherited*/, dataContractFormatAttribute.Style != OperationFormatStyle.Rpc, description.Body.WrapperNamespace, wrapperSequence, SchemaSet);
- }
- if (dataContractFormatAttribute.Style == OperationFormatStyle.Rpc)
- {
- AddParameterOrder(description);
- }
- }
- protected override void ExportKnownTypes()
- {
- foreach (Type knownType in operation.KnownTypes)
- {
- DataContractExporter.Export(knownType);
- }
- }
- protected override object GetExtensionData()
- {
- return new ExtensionData(((DataContractSerializerOperationBehavior)extension).DataContractFormatAttribute);
- }
- class ExtensionData
- {
- DataContractFormatAttribute dcFormatAttr;
- internal ExtensionData(DataContractFormatAttribute dcFormatAttr)
- {
- this.dcFormatAttr = dcFormatAttr;
- }
- public override bool Equals(object obj)
- {
- if (object.ReferenceEquals(dcFormatAttr, obj))
- return true;
- ExtensionData otherExtensionData = obj as ExtensionData;
- if (otherExtensionData == null)
- return false;
- return dcFormatAttr.Style == otherExtensionData.dcFormatAttr.Style;
- }
- public override int GetHashCode()
- {
- return 1; //This is never called
- }
- }
- }
- class XmlSerializerMessageContractExporter : MessageContractExporter
- {
- internal XmlSerializerMessageContractExporter(WsdlExporter exporter, WsdlContractConversionContext context, OperationDescription operation, IOperationBehavior extension)
- : base(exporter, context, operation, extension)
- {
- }
- protected override bool IsRpcStyle()
- {
- return ((XmlSerializerOperationBehavior)extension).XmlSerializerFormatAttribute.Style == OperationFormatStyle.Rpc;
- }
- protected override bool IsEncoded()
- {
- return ((XmlSerializerOperationBehavior)extension).XmlSerializerFormatAttribute.IsEncoded;
- }
- protected override object OnExportMessageContract()
- {
- object result = Reflector.ReflectOperation(operation);
- if (result == null)
- {
- // If result is null, that means that XmlSerializerFormatAttribute wasn't available in reflection,
- // so we need to get it from the XmlSerializerOperationBehavior instead
- XmlSerializerOperationBehavior serializerBehavior = this.extension as XmlSerializerOperationBehavior;
- if (serializerBehavior != null)
- {
- result = Reflector.ReflectOperation(operation, serializerBehavior.XmlSerializerFormatAttribute);
- }
- }
- return result;
- }
- protected override void ExportHeaders(int messageIndex, object state)
- {
- string portTypeName = contractContext.WsdlPortType.Name;
- string portTypeNs = contractContext.WsdlPortType.ServiceDescription.TargetNamespace;
- MessageDescription description = operation.Messages[messageIndex];
- if (description.Headers.Count > 0)
- {
- XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector = (XmlSerializerOperationBehavior.Reflector.OperationReflector)state;
- XmlMembersMapping membersMapping = null;
- if (messageIndex == 0)
- {
- membersMapping = operationReflector.Request.HeadersMapping;
- }
- else
- {
- membersMapping = operationReflector.Reply.HeadersMapping;
- }
- if (membersMapping != null)
- {
- WsdlNS.Message wsdlMessage;
- if (CreateHeaderMessage(description, out wsdlMessage))
- {
- ExportMembersMapping(membersMapping, wsdlMessage, false /*IsOperationInherited(operation)*/, operationReflector.IsEncoded, false/*isRpc*/, false/*isWrapped*/, true/*isHeader*/);
- }
- }
- }
- }
- protected override void ExportBody(int messageIndex, object state)
- {
- MessageDescription description = operation.Messages[messageIndex];
- string portTypeName = contractContext.WsdlPortType.Name;
- string portTypeNs = contractContext.WsdlPortType.ServiceDescription.TargetNamespace;
- MessageDescriptionDictionaryKey key = new MessageDescriptionDictionaryKey(this.contractContext.Contract, description);
- WsdlNS.Message wsdlMessage = this.ExportedMessages.WsdlMessages[key];
- XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector = (XmlSerializerOperationBehavior.Reflector.OperationReflector)state;
- XmlMembersMapping membersMapping = null;
- if (messageIndex == 0)
- {
- membersMapping = operationReflector.Request.BodyMapping;
- }
- else
- {
- membersMapping = operationReflector.Reply.BodyMapping;
- }
- if (membersMapping != null)
- {
- bool isDocWrapped = !operationReflector.IsRpc && description.Body.WrapperName != null;
- ExportMembersMapping(membersMapping, wsdlMessage, false /*IsOperationInherited(operation)*/, operationReflector.IsEncoded, operationReflector.IsRpc, isDocWrapped, false/*isHeader*/);
- if (operationReflector.IsRpc)
- {
- AddParameterOrder(operation.Messages[messageIndex]);
- this.ExportedMessages.WrapperNamespaces.Add(key, membersMapping.Namespace);
- }
- }
- }
- protected override void ExportFaults(object state)
- {
- XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector = (XmlSerializerOperationBehavior.Reflector.OperationReflector)state;
- if (operationReflector.Attribute.SupportFaults)
- {
- foreach (FaultDescription fault in operation.Faults)
- {
- ExportFault(fault, operationReflector);
- }
- Compile();
- }
- else
- {
- base.ExportFaults(state);
- }
- }
- void ExportFault(FaultDescription fault, XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector)
- {
- WsdlNS.Message faultMessage = new WsdlNS.Message();
- faultMessage.Name = GetFaultMessageName(fault.Name);
- XmlQualifiedName elementName = ExportFaultElement(fault, operationReflector);
- this.contractContext.WsdlPortType.ServiceDescription.Messages.Add(faultMessage);
- AddMessagePart(faultMessage, "detail", elementName, null);
- // create a wsdl:fault to put inside the wsdl:portType/wsdl:operation
- WsdlNS.OperationFault operationFault = contractContext.GetOperationFault(fault);
- WsdlExporter.WSAddressingHelper.AddActionAttribute(fault.Action, operationFault, this.exporter.PolicyVersion);
- operationFault.Message = new XmlQualifiedName(faultMessage.Name, faultMessage.ServiceDescription.TargetNamespace);
- }
- XmlQualifiedName ExportFaultElement(FaultDescription fault, XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector)
- {
- XmlQualifiedName elementName;
- XmlMembersMapping mapping = operationReflector.ImportFaultElement(fault, out elementName);
- if (operationReflector.IsEncoded)
- SoapExporter.ExportMembersMapping(mapping);
- else
- XmlExporter.ExportMembersMapping(mapping);
- return elementName;
- }
- protected override void ExportKnownTypes()
- {
- }
- protected override object GetExtensionData()
- {
- return new ExtensionData(((XmlSerializerOperationBehavior)this.extension).XmlSerializerFormatAttribute);
- }
- class ExtensionData
- {
- XmlSerializerFormatAttribute xsFormatAttr;
- internal ExtensionData(XmlSerializerFormatAttribute xsFormatAttr)
- {
- this.xsFormatAttr = xsFormatAttr;
- }
- public override bool Equals(object obj)
- {
- if (object.ReferenceEquals(xsFormatAttr, obj))
- return true;
- ExtensionData otherExtensionData = obj as ExtensionData;
- if (otherExtensionData == null)
- return false;
- return xsFormatAttr.Style == otherExtensionData.xsFormatAttr.Style &&
- xsFormatAttr.Use == otherExtensionData.xsFormatAttr.Use;
- }
- public override int GetHashCode()
- {
- return 1; //This is never called
- }
- }
- void ExportMembersMapping(XmlMembersMapping membersMapping, WsdlNS.Message message, bool skipSchemaExport, bool isEncoded, bool isRpc, bool isDocWrapped, bool isHeader)
- {
- if (!skipSchemaExport)
- {
- if (isEncoded)
- SoapExporter.ExportMembersMapping(membersMapping);
- else
- XmlExporter.ExportMembersMapping(membersMapping, !isRpc);
- }
- if (isDocWrapped)
- {
- if (isHeader)
- {
- Fx.Assert("Header cannot be Document Wrapped");
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Header cannot be Document Wrapped")));
- }
- AddMessagePart(message, "parameters", new XmlQualifiedName(membersMapping.XsdElementName, membersMapping.Namespace), XmlQualifiedName.Empty);
- return;
- }
- bool generateElement = !isRpc && !isEncoded;
- for (int i = 0; i < membersMapping.Count; i++)
- {
- XmlMemberMapping member = membersMapping[i];
- string partName = (isHeader || generateElement) ? NamingHelper.XmlName(member.MemberName) : member.XsdElementName;
- if (generateElement)
- AddMessagePart(message, partName, new XmlQualifiedName(member.XsdElementName, member.Namespace), XmlQualifiedName.Empty);
- else
- {
- if (string.IsNullOrEmpty(member.TypeName))
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxAnonymousTypeNotSupported, message.Name, partName)));
- AddMessagePart(message, partName, XmlQualifiedName.Empty, new XmlQualifiedName(member.TypeName, member.TypeNamespace));
- }
- }
- }
- XmlSerializerOperationBehavior.Reflector Reflector
- {
- get
- {
- object reflector;
- if (!exporter.State.TryGetValue(typeof(XmlSerializerOperationBehavior.Reflector), out reflector))
- {
- reflector = new XmlSerializerOperationBehavior.Reflector(contractContext.Contract.Namespace, contractContext.Contract.ContractType);
- exporter.State.Add(typeof(XmlSerializerOperationBehavior.Reflector), reflector);
- }
- return (XmlSerializerOperationBehavior.Reflector)reflector;
- }
- }
- SoapSchemaExporter SoapExporter
- {
- get
- {
- object soapExporter;
- if (!exporter.State.TryGetValue(typeof(SoapSchemaExporter), out soapExporter))
- {
- soapExporter = new SoapSchemaExporter(Schemas);
- exporter.State.Add(typeof(SoapSchemaExporter), soapExporter);
- }
- return (SoapSchemaExporter)soapExporter;
- }
- }
- XmlSchemaExporter XmlExporter
- {
- get
- {
- object xmlExporter;
- if (!exporter.State.TryGetValue(typeof(XmlSchemaExporter), out xmlExporter))
- {
- xmlExporter = new XmlSchemaExporter(Schemas);
- exporter.State.Add(typeof(XmlSchemaExporter), xmlExporter);
- }
- return (XmlSchemaExporter)xmlExporter;
- }
- }
- XmlSchemas Schemas
- {
- get
- {
- object schemas;
- if (!exporter.State.TryGetValue(typeof(XmlSchemas), out schemas))
- {
- schemas = new XmlSchemas();
- foreach (XmlSchema schema in this.SchemaSet.Schemas())
- if (!((XmlSchemas)schemas).Contains(schema.TargetNamespace))
- ((XmlSchemas)schemas).Add(schema);
- exporter.State.Add(typeof(XmlSchemas), schemas);
- }
- return (XmlSchemas)schemas;
- }
- }
- protected override void Compile()
- {
- XmlSchema wsdl = StockSchemas.CreateWsdl();
- XmlSchema soap = StockSchemas.CreateSoap();
- XmlSchema soapEncoding = StockSchemas.CreateSoapEncoding();
- XmlSchema fakeXsdSchema = StockSchemas.CreateFakeXsdSchema();
- MoveSchemas();
- SchemaSet.Add(wsdl);
- SchemaSet.Add(soap);
- SchemaSet.Add(soapEncoding);
- SchemaSet.Add(fakeXsdSchema);
- base.Compile();
- SchemaSet.Remove(wsdl);
- SchemaSet.Remove(soap);
- SchemaSet.Remove(soapEncoding);
- SchemaSet.Remove(fakeXsdSchema);
- }
- void MoveSchemas()
- {
- XmlSchemas schemas = this.Schemas;
- XmlSchemaSet schemaSet = this.SchemaSet;
- if (schemas != null)
- {
- schemas.Compile(
- delegate(object sender, ValidationEventArgs args)
- {
- SchemaHelper.HandleSchemaValidationError(sender, args, exporter.Errors);
- },
- false/*fullCompile*/
- );
- foreach (XmlSchema srcSchema in schemas)
- {
- if (!schemaSet.Contains(srcSchema))
- {
- schemaSet.Add(srcSchema);
- schemaSet.Reprocess(srcSchema);
- }
- }
- }
- }
- }
- static class StockSchemas
- {
- internal static XmlSchema CreateWsdl()
- {
- return XmlSchema.Read(new StringReader(wsdl), null);
- }
- internal static XmlSchema CreateSoap()
- {
- return XmlSchema.Read(new StringReader(soap), null);
- }
- internal static XmlSchema CreateSoapEncoding()
- {
- return XmlSchema.Read(new StringReader(soapEncoding), null);
- }
- internal static XmlSchema CreateFakeSoapEncoding()
- {
- return XmlSchema.Read(new StringReader(fakeSoapEncoding), null);
- }
- internal static XmlSchema CreateFakeXsdSchema()
- {
- return XmlSchema.Read(new StringReader(fakeXsd), null);
- }
- internal static XmlSchema CreateFakeXmlSchema()
- {
- return XmlSchema.Read(new StringReader(fakeXmlSchema), null);
- }
- internal static bool IsKnownSchema(string ns)
- {
- return ns == XmlSchema.Namespace || ns == "http://schemas.xmlsoap.org/wsdl/soap/" || ns == "http://schemas.xmlsoap.org/soap/encoding/";
- }
- internal const string WsdlNamespace = "http://schemas.xmlsoap.org/wsdl/";
- internal const string SoapNamespace = "http://schemas.xmlsoap.org/wsdl/soap/";
- internal const string SoapEncodingNamespace = "http://schemas.xmlsoap.org/soap/encoding/";
- const string wsdl = @"<?xml version='1.0' encoding='UTF-8' ?>
- <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
- xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
- targetNamespace='http://schemas.xmlsoap.org/wsdl/'
- elementFormDefault='qualified' >
-
- <xs:complexType mixed='true' name='tDocumentation' >
- <xs:sequence>
- <xs:any minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name='tDocumented' >
- <xs:annotation>
- <xs:documentation>
- This type is extended by component types to allow them to be documented
- </xs:documentation>
- </xs:annotation>
- <xs:sequence>
- <xs:element name='documentation' type='wsdl:tDocumentation' minOccurs='0' />
- </xs:sequence>
- </xs:complexType>
- <!-- allow extensibility via elements and attributes on all elements swa124 -->
- <xs:complexType name='tExtensibleAttributesDocumented' abstract='true' >
- <xs:complexContent>
- <xs:extension base='wsdl:tDocumented' >
- <xs:annotation>
- <xs:documentation>
- This type is extended by component types to allow attributes from other namespaces to be added.
- </xs:documentation>
- </xs:annotation>
- <xs:sequence>
- <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- <xs:anyAttribute namespace='##other' processContents='lax' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tExtensibleDocumented' abstract='true' >
- <xs:complexContent>
- <xs:extension base='wsdl:tDocumented' >
- <xs:annotation>
- <xs:documentation>
- This type is extended by component types to allow elements from other namespaces to be added.
- </xs:documentation>
- </xs:annotation>
- <xs:sequence>
- <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- <xs:anyAttribute namespace='##other' processContents='lax' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <!-- original wsdl removed as part of swa124 resolution
- <xs:complexType name='tExtensibleAttributesDocumented' abstract='true' >
- <xs:complexContent>
- <xs:extension base='wsdl:tDocumented' >
- <xs:annotation>
- <xs:documentation>
- This type is extended by component types to allow attributes from other namespaces to be added.
- </xs:documentation>
- </xs:annotation>
- <xs:anyAttribute namespace='##other' processContents='lax' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tExtensibleDocumented' abstract='true' >
- <xs:complexContent>
- <xs:extension base='wsdl:tDocumented' >
- <xs:annotation>
- <xs:documentation>
- This type is extended by component types to allow elements from other namespaces to be added.
- </xs:documentation>
- </xs:annotation>
- <xs:sequence>
- <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- -->
- <xs:element name='definitions' type='wsdl:tDefinitions' >
- <xs:key name='message' >
- <xs:selector xpath='wsdl:message' />
- <xs:field xpath='@name' />
- </xs:key>
- <xs:key name='portType' >
- <xs:selector xpath='wsdl:portType' />
- <xs:field xpath='@name' />
- </xs:key>
- <xs:key name='binding' >
- <xs:selector xpath='wsdl:binding' />
- <xs:field xpath='@name' />
- </xs:key>
- <xs:key name='service' >
- <xs:selector xpath='wsdl:service' />
- <xs:field xpath='@name' />
- </xs:key>
- <xs:key name='import' >
- <xs:selector xpath='wsdl:import' />
- <xs:field xpath='@namespace' />
- </xs:key>
- </xs:element>
- <xs:group name='anyTopLevelOptionalElement' >
- <xs:annotation>
- <xs:documentation>
- Any top level optional element allowed to appear more then once - any child of definitions element except wsdl:types. Any extensibility element is allowed in any place.
- </xs:documentation>
- </xs:annotation>
- <xs:choice>
- <xs:element name='import' type='wsdl:tImport' />
- <xs:element name='types' type='wsdl:tTypes' />
- <xs:element name='message' type='wsdl:tMessage' >
- <xs:unique name='part' >
- <xs:selector xpath='wsdl:part' />
- <xs:field xpath='@name' />
- </xs:unique>
- </xs:element>
- <xs:element name='portType' type='wsdl:tPortType' />
- <xs:element name='binding' type='wsdl:tBinding' />
- <xs:element name='service' type='wsdl:tService' >
- <xs:unique name='port' >
- <xs:selector xpath='wsdl:port' />
- <xs:field xpath='@name' />
- </xs:unique>
- </xs:element>
- </xs:choice>
- </xs:group>
- <xs:complexType name='tDefinitions' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:sequence>
- <xs:group ref='wsdl:anyTopLevelOptionalElement' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- <xs:attribute name='targetNamespace' type='xs:anyURI' use='optional' />
- <xs:attribute name='name' type='xs:NCName' use='optional' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tImport' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
- <xs:attribute name='namespace' type='xs:anyURI' use='required' />
- <xs:attribute name='location' type='xs:anyURI' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tTypes' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' />
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tMessage' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:sequence>
- <xs:element name='part' type='wsdl:tPart' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tPart' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
- <xs:attribute name='name' type='xs:NCName' use='required' />
- <xs:attribute name='element' type='xs:QName' use='optional' />
- <xs:attribute name='type' type='xs:QName' use='optional' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tPortType' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
- <xs:sequence>
- <xs:element name='operation' type='wsdl:tOperation' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tOperation' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:sequence>
- <xs:choice>
- <xs:group ref='wsdl:request-response-or-one-way-operation' />
- <xs:group ref='wsdl:solicit-response-or-notification-operation' />
- </xs:choice>
- </xs:sequence>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- <xs:attribute name='parameterOrder' type='xs:NMTOKENS' use='optional' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:group name='request-response-or-one-way-operation' >
- <xs:sequence>
- <xs:element name='input' type='wsdl:tParam' />
- <xs:sequence minOccurs='0' >
- <xs:element name='output' type='wsdl:tParam' />
- <xs:element name='fault' type='wsdl:tFault' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- </xs:sequence>
- </xs:group>
- <xs:group name='solicit-response-or-notification-operation' >
- <xs:sequence>
- <xs:element name='output' type='wsdl:tParam' />
- <xs:sequence minOccurs='0' >
- <xs:element name='input' type='wsdl:tParam' />
- <xs:element name='fault' type='wsdl:tFault' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- </xs:sequence>
- </xs:group>
-
- <xs:complexType name='tParam' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
- <xs:attribute name='name' type='xs:NCName' use='optional' />
- <xs:attribute name='message' type='xs:QName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tFault' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
- <xs:attribute name='name' type='xs:NCName' use='required' />
- <xs:attribute name='message' type='xs:QName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tBinding' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:sequence>
- <xs:element name='operation' type='wsdl:tBindingOperation' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- <xs:attribute name='type' type='xs:QName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tBindingOperationMessage' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:attribute name='name' type='xs:NCName' use='optional' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tBindingOperationFault' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:attribute name='name' type='xs:NCName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tBindingOperation' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:sequence>
- <xs:element name='input' type='wsdl:tBindingOperationMessage' minOccurs='0' />
- <xs:element name='output' type='wsdl:tBindingOperationMessage' minOccurs='0' />
- <xs:element name='fault' type='wsdl:tBindingOperationFault' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tService' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:sequence>
- <xs:element name='port' type='wsdl:tPort' minOccurs='0' maxOccurs='unbounded' />
- </xs:sequence>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
-
- <xs:complexType name='tPort' >
- <xs:complexContent>
- <xs:extension base='wsdl:tExtensibleDocumented' >
- <xs:attribute name='name' type='xs:NCName' use='required' />
- <xs:attribute name='binding' type='xs:QName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:attribute name='arrayType' type='xs:string' />
- <xs:attribute name='required' type='xs:boolean' />
- <xs:complexType name='tExtensibilityElement' abstract='true' >
- <xs:attribute ref='wsdl:required' use='optional' />
- </xs:complexType>
- </xs:schema>";
- const string soap = @"<?xml version='1.0' encoding='UTF-8' ?>
- <xs:schema xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' targetNamespace='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
- <xs:import namespace='http://schemas.xmlsoap.org/wsdl/' />
- <xs:simpleType name='encodingStyle'>
- <xs:annotation>
- <xs:documentation>
- 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification
- </xs:documentation>
- </xs:annotation>
- <xs:list itemType='xs:anyURI' />
- </xs:simpleType>
- <xs:element name='binding' type='soap:tBinding' />
- <xs:complexType name='tBinding'>
- <xs:complexContent mixed='false'>
- <xs:extension base='wsdl:tExtensibilityElement'>
- <xs:attribute name='transport' type='xs:anyURI' use='required' />
- <xs:attribute name='style' type='soap:tStyleChoice' use='optional' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:simpleType name='tStyleChoice'>
- <xs:restriction base='xs:string'>
- <xs:enumeration value='rpc' />
- <xs:enumeration value='document' />
- </xs:restriction>
- </xs:simpleType>
- <xs:element name='operation' type='soap:tOperation' />
- <xs:complexType name='tOperation'>
- <xs:complexContent mixed='false'>
- <xs:extension base='wsdl:tExtensibilityElement'>
- <xs:attribute name='soapAction' type='xs:anyURI' use='optional' />
- <xs:attribute name='style' type='soap:tStyleChoice' use='optional' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:element name='body' type='soap:tBody' />
- <xs:attributeGroup name='tBodyAttributes'>
- <xs:attribute name='encodingStyle' type='soap:encodingStyle' use='optional' />
- <xs:attribute name='use' type='soap:useChoice' use='optional' />
- <xs:attribute name='namespace' type='xs:anyURI' use='optional' />
- </xs:attributeGroup>
- <xs:complexType name='tBody'>
- <xs:complexContent mixed='false'>
- <xs:extension base='wsdl:tExtensibilityElement'>
- <xs:attribute name='parts' type='xs:NMTOKENS' use='optional' />
- <xs:attributeGroup ref='soap:tBodyAttributes' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:simpleType name='useChoice'>
- <xs:restriction base='xs:string'>
- <xs:enumeration value='literal' />
- <xs:enumeration value='encoded' />
- </xs:restriction>
- </xs:simpleType>
- <xs:element name='fault' type='soap:tFault' />
- <xs:complexType name='tFaultRes' abstract='true'>
- <xs:complexContent mixed='false'>
- <xs:restriction base='soap:tBody'>
- <xs:attribute ref='wsdl:required' use='optional' />
- <xs:attribute name='parts' type='xs:NMTOKENS' use='prohibited' />
- <xs:attributeGroup ref='soap:tBodyAttributes' />
- </xs:restriction>
- </xs:complexContent>
- </xs:complexType>
- <xs:complexType name='tFault'>
- <xs:complexContent mixed='false'>
- <xs:extension base='soap:tFaultRes'>
- <xs:attribute name='name' type='xs:NCName' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:element name='header' type='soap:tHeader' />
- <xs:attributeGroup name='tHeaderAttributes'>
- <xs:attribute name='message' type='xs:QName' use='required' />
- <xs:attribute name='part' type='xs:NMTOKEN' use='required' />
- <xs:attribute name='use' type='soap:useChoice' use='required' />
- <xs:attribute name='encodingStyle' type='soap:encodingStyle' use='optional' />
- <xs:attribute name='namespace' type='xs:anyURI' use='optional' />
- </xs:attributeGroup>
- <xs:complexType name='tHeader'>
- <xs:complexContent mixed='false'>
- <xs:extension base='wsdl:tExtensibilityElement'>
- <xs:sequence>
- <xs:element minOccurs='0' maxOccurs='unbounded' ref='soap:headerfault' />
- </xs:sequence>
- <xs:attributeGroup ref='soap:tHeaderAttributes' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- <xs:element name='headerfault' type='soap:tHeaderFault' />
- <xs:complexType name='tHeaderFault'>
- <xs:attributeGroup ref='soap:tHeaderAttributes' />
- </xs:complexType>
- <xs:element name='address' type='soap:tAddress' />
- <xs:complexType name='tAddress'>
- <xs:complexContent mixed='false'>
- <xs:extension base='wsdl:tExtensibilityElement'>
- <xs:attribute name='location' type='xs:anyURI' use='required' />
- </xs:extension>
- </xs:complexContent>
- </xs:complexType>
- </xs:schema>";
- const string soapEncoding = @"<?xml version='1.0' encoding='UTF-8' ?>
- <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
- xmlns:tns='http://schemas.xmlsoap.org/soap/encoding/'
- targetNamespace='http://schemas.xmlsoap.org/soap/encoding/' >
-
- <xs:attribute name='root' >
- <xs:simpleType>
- <xs:restriction base='xs:boolean'>
- <xs:pattern value='0|1' />
- </xs:restriction>
- </xs:simpleType>
- </xs:attribute>
- <xs:attributeGroup name='commonAttributes' >
- <xs:attribute name='id' type='xs:ID' />
- <xs:attribute name='href' type='xs:anyURI' />
- <xs:anyAttribute namespace='##other' processContents='lax' />
- </xs:attributeGroup>
-
- <xs:simpleType name='arrayCoordinate' >
- <xs:restriction base='xs:string' />
- </xs:simpleType>
-
- <xs:attribute name='arrayType' type='xs:string' />
- <xs:attribute name='offset' type='tns:arrayCoordinate' />
-
- <xs:attributeGroup name='arrayAttributes' >
- <xs:attribute ref='tns:arrayType' />
- <xs:attribute ref='tns:offset' />
- </xs:attributeGroup>
-
- <xs:attribute name='position' type='tns:arrayCoordinate' />
-
- <xs:attributeGroup name='arrayMemberAttributes' >
- <xs:attribute ref='tns:position' />
- </xs:attributeGroup>
- <xs:group name='Array' >
- <xs:sequence>
- <xs:any namespace='##any' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- </xs:group>
- <xs:element name='Array' type='tns:Array' />
- <xs:complexType name='Array' >
- <xs:group ref='tns:Array' minOccurs='0' />
- <xs:attributeGroup ref='tns:arrayAttributes' />
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:complexType>
- <xs:element name='Struct' type='tns:Struct' />
- <xs:group name='Struct' >
- <xs:sequence>
- <xs:any namespace='##any' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- </xs:group>
- <xs:complexType name='Struct' >
- <xs:group ref='tns:Struct' minOccurs='0' />
- <xs:attributeGroup ref='tns:commonAttributes'/>
- </xs:complexType>
-
- <xs:simpleType name='base64' >
- <xs:restriction base='xs:base64Binary' />
- </xs:simpleType>
- <xs:element name='duration' type='tns:duration' />
- <xs:complexType name='duration' >
- <xs:simpleContent>
- <xs:extension base='xs:duration' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='dateTime' type='tns:dateTime' />
- <xs:complexType name='dateTime' >
- <xs:simpleContent>
- <xs:extension base='xs:dateTime' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='NOTATION' type='tns:NOTATION' />
- <xs:complexType name='NOTATION' >
- <xs:simpleContent>
- <xs:extension base='xs:QName' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
-
- <xs:element name='time' type='tns:time' />
- <xs:complexType name='time' >
- <xs:simpleContent>
- <xs:extension base='xs:time' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='date' type='tns:date' />
- <xs:complexType name='date' >
- <xs:simpleContent>
- <xs:extension base='xs:date' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='gYearMonth' type='tns:gYearMonth' />
- <xs:complexType name='gYearMonth' >
- <xs:simpleContent>
- <xs:extension base='xs:gYearMonth' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='gYear' type='tns:gYear' />
- <xs:complexType name='gYear' >
- <xs:simpleContent>
- <xs:extension base='xs:gYear' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='gMonthDay' type='tns:gMonthDay' />
- <xs:complexType name='gMonthDay' >
- <xs:simpleContent>
- <xs:extension base='xs:gMonthDay' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='gDay' type='tns:gDay' />
- <xs:complexType name='gDay' >
- <xs:simpleContent>
- <xs:extension base='xs:gDay' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='gMonth' type='tns:gMonth' />
- <xs:complexType name='gMonth' >
- <xs:simpleContent>
- <xs:extension base='xs:gMonth' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
-
- <xs:element name='boolean' type='tns:boolean' />
- <xs:complexType name='boolean' >
- <xs:simpleContent>
- <xs:extension base='xs:boolean' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='base64Binary' type='tns:base64Binary' />
- <xs:complexType name='base64Binary' >
- <xs:simpleContent>
- <xs:extension base='xs:base64Binary' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='hexBinary' type='tns:hexBinary' />
- <xs:complexType name='hexBinary' >
- <xs:simpleContent>
- <xs:extension base='xs:hexBinary' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='float' type='tns:float' />
- <xs:complexType name='float' >
- <xs:simpleContent>
- <xs:extension base='xs:float' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='double' type='tns:double' />
- <xs:complexType name='double' >
- <xs:simpleContent>
- <xs:extension base='xs:double' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='anyURI' type='tns:anyURI' />
- <xs:complexType name='anyURI' >
- <xs:simpleContent>
- <xs:extension base='xs:anyURI' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='QName' type='tns:QName' />
- <xs:complexType name='QName' >
- <xs:simpleContent>
- <xs:extension base='xs:QName' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
-
- <xs:element name='string' type='tns:string' />
- <xs:complexType name='string' >
- <xs:simpleContent>
- <xs:extension base='xs:string' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='normalizedString' type='tns:normalizedString' />
- <xs:complexType name='normalizedString' >
- <xs:simpleContent>
- <xs:extension base='xs:normalizedString' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='token' type='tns:token' />
- <xs:complexType name='token' >
- <xs:simpleContent>
- <xs:extension base='xs:token' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='language' type='tns:language' />
- <xs:complexType name='language' >
- <xs:simpleContent>
- <xs:extension base='xs:language' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='Name' type='tns:Name' />
- <xs:complexType name='Name' >
- <xs:simpleContent>
- <xs:extension base='xs:Name' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='NMTOKEN' type='tns:NMTOKEN' />
- <xs:complexType name='NMTOKEN' >
- <xs:simpleContent>
- <xs:extension base='xs:NMTOKEN' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='NCName' type='tns:NCName' />
- <xs:complexType name='NCName' >
- <xs:simpleContent>
- <xs:extension base='xs:NCName' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='NMTOKENS' type='tns:NMTOKENS' />
- <xs:complexType name='NMTOKENS' >
- <xs:simpleContent>
- <xs:extension base='xs:NMTOKENS' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='ID' type='tns:ID' />
- <xs:complexType name='ID' >
- <xs:simpleContent>
- <xs:extension base='xs:ID' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='IDREF' type='tns:IDREF' />
- <xs:complexType name='IDREF' >
- <xs:simpleContent>
- <xs:extension base='xs:IDREF' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='ENTITY' type='tns:ENTITY' />
- <xs:complexType name='ENTITY' >
- <xs:simpleContent>
- <xs:extension base='xs:ENTITY' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='IDREFS' type='tns:IDREFS' />
- <xs:complexType name='IDREFS' >
- <xs:simpleContent>
- <xs:extension base='xs:IDREFS' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='ENTITIES' type='tns:ENTITIES' />
- <xs:complexType name='ENTITIES' >
- <xs:simpleContent>
- <xs:extension base='xs:ENTITIES' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='decimal' type='tns:decimal' />
- <xs:complexType name='decimal' >
- <xs:simpleContent>
- <xs:extension base='xs:decimal' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='integer' type='tns:integer' />
- <xs:complexType name='integer' >
- <xs:simpleContent>
- <xs:extension base='xs:integer' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='nonPositiveInteger' type='tns:nonPositiveInteger' />
- <xs:complexType name='nonPositiveInteger' >
- <xs:simpleContent>
- <xs:extension base='xs:nonPositiveInteger' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='negativeInteger' type='tns:negativeInteger' />
- <xs:complexType name='negativeInteger' >
- <xs:simpleContent>
- <xs:extension base='xs:negativeInteger' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='long' type='tns:long' />
- <xs:complexType name='long' >
- <xs:simpleContent>
- <xs:extension base='xs:long' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='int' type='tns:int' />
- <xs:complexType name='int' >
- <xs:simpleContent>
- <xs:extension base='xs:int' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='short' type='tns:short' />
- <xs:complexType name='short' >
- <xs:simpleContent>
- <xs:extension base='xs:short' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='byte' type='tns:byte' />
- <xs:complexType name='byte' >
- <xs:simpleContent>
- <xs:extension base='xs:byte' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='nonNegativeInteger' type='tns:nonNegativeInteger' />
- <xs:complexType name='nonNegativeInteger' >
- <xs:simpleContent>
- <xs:extension base='xs:nonNegativeInteger' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='unsignedLong' type='tns:unsignedLong' />
- <xs:complexType name='unsignedLong' >
- <xs:simpleContent>
- <xs:extension base='xs:unsignedLong' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='unsignedInt' type='tns:unsignedInt' />
- <xs:complexType name='unsignedInt' >
- <xs:simpleContent>
- <xs:extension base='xs:unsignedInt' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='unsignedShort' type='tns:unsignedShort' />
- <xs:complexType name='unsignedShort' >
- <xs:simpleContent>
- <xs:extension base='xs:unsignedShort' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='unsignedByte' type='tns:unsignedByte' />
- <xs:complexType name='unsignedByte' >
- <xs:simpleContent>
- <xs:extension base='xs:unsignedByte' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='positiveInteger' type='tns:positiveInteger' />
- <xs:complexType name='positiveInteger' >
- <xs:simpleContent>
- <xs:extension base='xs:positiveInteger' >
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- <xs:element name='anyType' />
- </xs:schema>";
- const string fakeXsd = @"<?xml version='1.0' encoding='UTF-8' ?>
- <xsd:schema targetNamespace=""http://www.w3.org/2001/XMLSchema"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
- <xsd:element name=""schema"">
- <xsd:complexType />
- </xsd:element>
- </xsd:schema>";
- const string fakeXmlSchema = @"<xs:schema targetNamespace='http://www.w3.org/XML/1998/namespace' xmlns:xs='http://www.w3.org/2001/XMLSchema' xml:lang='en'>
- <xs:attribute name='lang' type='xs:language'/>
- <xs:attribute name='space'>
- <xs:simpleType>
- <xs:restriction base='xs:NCName'>
- <xs:enumeration value='default'/>
- <xs:enumeration value='preserve'/>
- </xs:restriction>
- </xs:simpleType>
- </xs:attribute>
- <xs:attribute name='base' type='xs:anyURI'/>
- <xs:attribute name='id' type='xs:ID' />
- <xs:attributeGroup name='specialAttrs'>
- <xs:attribute ref='xml:base'/>
- <xs:attribute ref='xml:lang'/>
- <xs:attribute ref='xml:space'/>
- </xs:attributeGroup>
- </xs:schema>";
- const string fakeSoapEncoding = @"<?xml version='1.0' encoding='UTF-8' ?>
- <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
- xmlns:tns='http://schemas.xmlsoap.org/soap/encoding/'
- targetNamespace='http://schemas.xmlsoap.org/soap/encoding/' >
-
- <xs:attributeGroup name='commonAttributes' >
- <xs:attribute name='id' type='xs:ID' />
- <xs:attribute name='href' type='xs:anyURI' />
- <xs:anyAttribute namespace='##other' processContents='lax' />
- </xs:attributeGroup>
-
- <xs:simpleType name='arrayCoordinate' >
- <xs:restriction base='xs:string' />
- </xs:simpleType>
-
- <xs:attribute name='arrayType' type='xs:string' />
- <xs:attribute name='offset' type='tns:arrayCoordinate' />
-
- <xs:attributeGroup name='arrayAttributes' >
- <xs:attribute ref='tns:arrayType' />
- <xs:attribute ref='tns:offset' />
- </xs:attributeGroup>
- <xs:group name='Array' >
- <xs:sequence>
- <xs:any namespace='##any' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
- </xs:sequence>
- </xs:group>
- <xs:element name='Array' type='tns:Array' />
- <xs:complexType name='Array' >
- <xs:group ref='tns:Array' minOccurs='0' />
- <xs:attributeGroup ref='tns:arrayAttributes' />
- <xs:attributeGroup ref='tns:commonAttributes' />
- </xs:complexType>
- </xs:schema>";
- }
- }
|