MessageContractExporter.cs 95 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Description
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Diagnostics.CodeAnalysis;
  9. using System.Globalization;
  10. using System.IO;
  11. using System.Reflection;
  12. using System.Runtime;
  13. using System.Runtime.Serialization;
  14. using System.ServiceModel;
  15. using System.ServiceModel.Dispatcher;
  16. using System.Xml;
  17. using System.Xml.Schema;
  18. using System.Xml.Serialization;
  19. using WsdlNS = System.Web.Services.Description;
  20. abstract class MessageContractExporter
  21. {
  22. readonly protected WsdlContractConversionContext contractContext;
  23. readonly protected WsdlExporter exporter;
  24. readonly protected OperationDescription operation;
  25. readonly protected IOperationBehavior extension;
  26. static internal void ExportMessageBinding(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext, Type messageContractExporterType, OperationDescription operation)
  27. {
  28. new MessageBindingExporter(exporter, endpointContext).ExportMessageBinding(operation, messageContractExporterType);
  29. }
  30. protected abstract object OnExportMessageContract();
  31. protected abstract void ExportHeaders(int messageIndex, object state);
  32. protected abstract void ExportBody(int messageIndex, object state);
  33. protected abstract void ExportKnownTypes();
  34. protected abstract bool IsRpcStyle();
  35. protected abstract bool IsEncoded();
  36. protected abstract object GetExtensionData();
  37. protected MessageExportContext ExportedMessages
  38. {
  39. get { return GetMessageExportContext(exporter); }
  40. }
  41. void AddElementToSchema(XmlSchemaElement element, string elementNs, XmlSchemaSet schemaSet)
  42. {
  43. OperationDescription parentOperation = this.operation;
  44. if (parentOperation.OperationMethod != null)
  45. {
  46. XmlQualifiedName qname = new XmlQualifiedName(element.Name, elementNs);
  47. OperationElement existingElement;
  48. if (ExportedMessages.ElementTypes.TryGetValue(qname, out existingElement))
  49. {
  50. if (existingElement.Operation.OperationMethod == parentOperation.OperationMethod)
  51. return;
  52. if (!SchemaHelper.IsMatch(element, existingElement.Element))
  53. {
  54. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CannotHaveTwoOperationsWithTheSameElement5, parentOperation.OperationMethod.DeclaringType, parentOperation.OperationMethod.Name, qname, existingElement.Operation.OperationMethod.DeclaringType, existingElement.Operation.Name)));
  55. }
  56. return;
  57. }
  58. else
  59. {
  60. ExportedMessages.ElementTypes.Add(qname, new OperationElement(element, parentOperation));
  61. }
  62. }
  63. SchemaHelper.AddElementToSchema(element, SchemaHelper.GetSchema(elementNs, schemaSet), schemaSet);
  64. }
  65. static MessageExportContext GetMessageExportContext(WsdlExporter exporter)
  66. {
  67. object messageExportContext;
  68. if (!exporter.State.TryGetValue(typeof(MessageExportContext), out messageExportContext))
  69. {
  70. messageExportContext = new MessageExportContext();
  71. exporter.State[typeof(MessageExportContext)] = messageExportContext;
  72. }
  73. return (MessageExportContext)messageExportContext;
  74. }
  75. protected MessageContractExporter(WsdlExporter exporter, WsdlContractConversionContext context, OperationDescription operation, IOperationBehavior extension)
  76. {
  77. this.exporter = exporter;
  78. this.contractContext = context;
  79. this.operation = operation;
  80. this.extension = extension;
  81. }
  82. internal void ExportMessageContract()
  83. {
  84. if (extension == null)
  85. return;
  86. object state = OnExportMessageContract();
  87. OperationFormatter.Validate(operation, IsRpcStyle(), IsEncoded());
  88. ExportKnownTypes();
  89. for (int messageIndex = 0; messageIndex < operation.Messages.Count; messageIndex++)
  90. ExportMessage(messageIndex, state);
  91. if (!operation.IsOneWay)
  92. {
  93. ExportFaults(state);
  94. }
  95. foreach (XmlSchema schema in exporter.GeneratedXmlSchemas.Schemas())
  96. EnsureXsdImport(schema.TargetNamespace, contractContext.WsdlPortType.ServiceDescription);
  97. }
  98. void ExportMessage(int messageIndex, object state)
  99. {
  100. try
  101. {
  102. MessageDescription description = operation.Messages[messageIndex];
  103. WsdlNS.Message wsdlMessage;
  104. if (CreateMessage(description, messageIndex, out wsdlMessage))
  105. {
  106. if (description.IsUntypedMessage)
  107. {
  108. ExportAnyMessage(wsdlMessage, description.Body.ReturnValue ?? description.Body.Parts[0]);
  109. return;
  110. }
  111. bool isRequest = (messageIndex == 0);
  112. StreamFormatter streamFormatter = StreamFormatter.Create(description, operation.Name, isRequest);
  113. if (streamFormatter != null)
  114. {
  115. ExportStreamBody(wsdlMessage, streamFormatter.WrapperName, streamFormatter.WrapperNamespace, streamFormatter.PartName, streamFormatter.PartNamespace, IsRpcStyle(), false /*IsOperationInherited(operation)*/);
  116. }
  117. else
  118. {
  119. ExportBody(messageIndex, state);
  120. }
  121. }
  122. if (!description.IsUntypedMessage)
  123. {
  124. ExportHeaders(messageIndex, state);
  125. }
  126. }
  127. finally
  128. {
  129. Compile();
  130. }
  131. }
  132. protected virtual void ExportFaults(object state)
  133. {
  134. foreach (FaultDescription fault in operation.Faults)
  135. {
  136. ExportFault(fault);
  137. }
  138. }
  139. protected bool IsOperationInherited()
  140. {
  141. return operation.DeclaringContract != contractContext.Contract;
  142. }
  143. void ExportAnyMessage(WsdlNS.Message message, MessagePartDescription part)
  144. {
  145. XmlSchemaSet schemas = this.exporter.GeneratedXmlSchemas;
  146. XmlSchema schema = SchemaHelper.GetSchema(DataContractSerializerMessageContractImporter.GenericMessageTypeName.Namespace, schemas);
  147. if (!schema.SchemaTypes.Contains(DataContractSerializerMessageContractImporter.GenericMessageTypeName))
  148. {
  149. XmlSchemaComplexType genericMessageType = new XmlSchemaComplexType();
  150. genericMessageType.Name = DataContractSerializerMessageContractImporter.GenericMessageTypeName.Name;
  151. XmlSchemaSequence bodySequence = new XmlSchemaSequence();
  152. genericMessageType.Particle = bodySequence;
  153. XmlSchemaAny anyElement = new XmlSchemaAny();
  154. anyElement.MinOccurs = 0;
  155. anyElement.MaxOccurs = decimal.MaxValue;
  156. anyElement.Namespace = "##any";
  157. bodySequence.Items.Add(anyElement);
  158. SchemaHelper.AddTypeToSchema(genericMessageType, schema, schemas);
  159. }
  160. string partName = string.IsNullOrEmpty(part.UniquePartName) ? part.Name : part.UniquePartName;
  161. WsdlNS.MessagePart wsdlPart = AddMessagePart(message, partName, XmlQualifiedName.Empty, DataContractSerializerMessageContractImporter.GenericMessageTypeName);
  162. part.UniquePartName = wsdlPart.Name;
  163. }
  164. protected void ExportStreamBody(WsdlNS.Message message, string wrapperName, string wrapperNs, string partName, string partNs, bool isRpc, bool skipSchemaExport)
  165. {
  166. XmlSchemaSet schemas = this.exporter.GeneratedXmlSchemas;
  167. XmlSchema schema = SchemaHelper.GetSchema(DataContractSerializerMessageContractImporter.StreamBodyTypeName.Namespace, schemas);
  168. if (!schema.SchemaTypes.Contains(DataContractSerializerMessageContractImporter.StreamBodyTypeName))
  169. {
  170. XmlSchemaSimpleType streamBodyType = new XmlSchemaSimpleType();
  171. streamBodyType.Name = DataContractSerializerMessageContractImporter.StreamBodyTypeName.Name;
  172. XmlSchemaSimpleTypeRestriction contentRestriction = new XmlSchemaSimpleTypeRestriction();
  173. contentRestriction.BaseTypeName = XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Base64Binary).QualifiedName;
  174. streamBodyType.Content = contentRestriction;
  175. SchemaHelper.AddTypeToSchema(streamBodyType, schema, schemas);
  176. }
  177. XmlSchemaSequence wrapperSequence = null;
  178. if (!isRpc && wrapperName != null)
  179. wrapperSequence = ExportWrappedPart(message, wrapperName, wrapperNs, schemas, skipSchemaExport);
  180. MessagePartDescription streamPart = new MessagePartDescription(partName, partNs);
  181. ExportMessagePart(message, streamPart, DataContractSerializerMessageContractImporter.StreamBodyTypeName, null/*xsdType*/, false/*isOptional*/, false/*isNillable*/, skipSchemaExport, !isRpc, wrapperNs, wrapperSequence, schemas);
  182. }
  183. void ExportFault(FaultDescription fault)
  184. {
  185. WsdlNS.Message faultMessage = new WsdlNS.Message();
  186. faultMessage.Name = GetFaultMessageName(fault.Name);
  187. XmlQualifiedName elementName = ExportFaultElement(fault);
  188. this.contractContext.WsdlPortType.ServiceDescription.Messages.Add(faultMessage);
  189. AddMessagePart(faultMessage, "detail", elementName, null);
  190. // create a wsdl:fault to put inside the wsdl:portType/wsdl:operation
  191. WsdlNS.OperationFault operationFault = contractContext.GetOperationFault(fault);
  192. WsdlExporter.WSAddressingHelper.AddActionAttribute(fault.Action, operationFault, this.exporter.PolicyVersion);
  193. operationFault.Message = new XmlQualifiedName(faultMessage.Name, faultMessage.ServiceDescription.TargetNamespace);
  194. }
  195. XmlQualifiedName ExportFaultElement(FaultDescription fault)
  196. {
  197. XmlSchemaType xsdType;
  198. XmlQualifiedName typeName = ExportType(fault.DetailType, fault.Name, operation.Name, out xsdType);
  199. XmlQualifiedName elementName;
  200. if (XmlName.IsNullOrEmpty(fault.ElementName))
  201. {
  202. elementName = DataContractExporter.GetRootElementName(fault.DetailType);
  203. if (elementName == null)
  204. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxFaultTypeAnonymous, operation.Name, fault.DetailType.FullName)));
  205. }
  206. else
  207. elementName = new XmlQualifiedName(fault.ElementName.EncodedName, fault.Namespace);
  208. ExportGlobalElement(elementName.Name, elementName.Namespace, true/*isNillable*/, typeName, xsdType, this.exporter.GeneratedXmlSchemas);
  209. return elementName;
  210. }
  211. protected XsdDataContractExporter DataContractExporter
  212. {
  213. get
  214. {
  215. object dataContractExporter;
  216. if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter), out dataContractExporter))
  217. {
  218. dataContractExporter = new XsdDataContractExporter(this.exporter.GeneratedXmlSchemas);
  219. exporter.State.Add(typeof(XsdDataContractExporter), dataContractExporter);
  220. }
  221. return (XsdDataContractExporter)dataContractExporter;
  222. }
  223. }
  224. protected XmlQualifiedName ExportType(Type type, string partName, string operationName, out XmlSchemaType xsdType)
  225. {
  226. xsdType = null;
  227. if (type == null)
  228. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxExportMustHaveType, operationName, partName)));
  229. if (type == typeof(void))
  230. return null;
  231. DataContractExporter.Export(type);
  232. XmlQualifiedName typeName = DataContractExporter.GetSchemaTypeName(type);
  233. if (IsNullOrEmpty(typeName))
  234. xsdType = DataContractExporter.GetSchemaType(type);
  235. return typeName;
  236. }
  237. protected XmlSchemaSet SchemaSet
  238. {
  239. get
  240. {
  241. return exporter.GeneratedXmlSchemas;
  242. }
  243. }
  244. static protected WsdlNS.MessagePart AddMessagePart(WsdlNS.Message message, string partName, XmlQualifiedName elementName, XmlQualifiedName typeName)
  245. {
  246. if (message.Parts[partName] != null)
  247. {
  248. if (IsNullOrEmpty(elementName))
  249. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SFxPartNameMustBeUniqueInRpc, partName)));
  250. int i = 1;
  251. while (message.Parts[partName + i] != null)
  252. {
  253. if (i == Int32.MaxValue)
  254. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SFxTooManyPartsWithSameName, partName)));
  255. i++;
  256. }
  257. partName = partName + i.ToString(CultureInfo.InvariantCulture);
  258. }
  259. WsdlNS.MessagePart part = new WsdlNS.MessagePart();
  260. part.Name = partName;
  261. part.Element = elementName;
  262. part.Type = typeName;
  263. message.Parts.Add(part);
  264. EnsureXsdImport(IsNullOrEmpty(elementName) ? typeName.Namespace : elementName.Namespace, message.ServiceDescription);
  265. return part;
  266. }
  267. static void EnsureXsdImport(string ns, WsdlNS.ServiceDescription wsdl)
  268. {
  269. string refNs = wsdl.TargetNamespace;
  270. if (!refNs.EndsWith("/", StringComparison.Ordinal))
  271. refNs = refNs + "/Imports";
  272. else
  273. refNs += "Imports";
  274. if (refNs == ns)
  275. refNs = wsdl.TargetNamespace;
  276. XmlSchema xsd = GetContainedSchema(wsdl, refNs);
  277. if (xsd != null)
  278. {
  279. foreach (object include in xsd.Includes)
  280. {
  281. XmlSchemaImport import = include as XmlSchemaImport;
  282. if (import != null && SchemaHelper.NamespacesEqual(import.Namespace, ns))
  283. return;
  284. }
  285. }
  286. else
  287. {
  288. xsd = new XmlSchema();
  289. xsd.TargetNamespace = refNs;
  290. wsdl.Types.Schemas.Add(xsd);
  291. }
  292. XmlSchemaImport imp = new XmlSchemaImport();
  293. if (ns != null && ns.Length > 0)
  294. imp.Namespace = ns;
  295. xsd.Includes.Add(imp);
  296. }
  297. static XmlSchema GetContainedSchema(WsdlNS.ServiceDescription wsdl, string ns)
  298. {
  299. foreach (XmlSchema xsd in wsdl.Types.Schemas)
  300. if (SchemaHelper.NamespacesEqual(xsd.TargetNamespace, ns))
  301. return xsd;
  302. return null;
  303. }
  304. static protected bool IsNullOrEmpty(XmlQualifiedName qname)
  305. {
  306. return qname == null || qname.IsEmpty;
  307. }
  308. protected void ExportGlobalElement(string elementName, string elementNs, bool isNillable, XmlQualifiedName typeName, XmlSchemaType xsdType, XmlSchemaSet schemaSet)
  309. {
  310. #if DEBUG
  311. Fx.Assert(NamingHelper.IsValidNCName(elementName), "Name value has to be a valid NCName.");
  312. if (xsdType == null)
  313. Fx.Assert(NamingHelper.IsValidNCName(typeName.Name), "Name value has to be a valid NCName.");
  314. #endif
  315. XmlSchemaElement element = new XmlSchemaElement();
  316. element.Name = elementName;
  317. if (xsdType != null)
  318. element.SchemaType = xsdType;
  319. else
  320. element.SchemaTypeName = typeName;
  321. element.IsNillable = isNillable;
  322. AddElementToSchema(element, elementNs, schemaSet);
  323. }
  324. void ExportLocalElement(string wrapperNs, string elementName, string elementNs, XmlQualifiedName typeName, XmlSchemaType xsdType, bool multiple, bool isOptional, bool isNillable, XmlSchemaSequence sequence, XmlSchemaSet schemaSet)
  325. {
  326. #if DEBUG
  327. Fx.Assert(NamingHelper.IsValidNCName(elementName), "Name value has to be a valid NCName.");
  328. if (xsdType == null)
  329. Fx.Assert(NamingHelper.IsValidNCName(typeName.Name), "Name value has to be a valid NCName.");
  330. #endif
  331. XmlSchema schema = SchemaHelper.GetSchema(wrapperNs, schemaSet);
  332. XmlSchemaElement element = new XmlSchemaElement();
  333. if (elementNs == wrapperNs)
  334. {
  335. element.Name = elementName;
  336. if (xsdType != null)
  337. element.SchemaType = xsdType;
  338. else
  339. {
  340. element.SchemaTypeName = typeName;
  341. SchemaHelper.AddImportToSchema(element.SchemaTypeName.Namespace, schema);
  342. }
  343. SchemaHelper.AddElementForm(element, schema);
  344. element.IsNillable = isNillable;
  345. }
  346. else
  347. {
  348. element.RefName = new XmlQualifiedName(elementName, elementNs);
  349. SchemaHelper.AddImportToSchema(elementNs, schema);
  350. ExportGlobalElement(elementName, elementNs, isNillable, typeName, xsdType, schemaSet);
  351. }
  352. if (multiple)
  353. element.MaxOccurs = Decimal.MaxValue;
  354. if (isOptional)
  355. element.MinOccurs = 0;
  356. sequence.Items.Add(element);
  357. }
  358. static readonly XmlSchemaSequence emptySequence = new XmlSchemaSequence();
  359. protected XmlSchemaSequence ExportWrappedPart(WsdlNS.Message message, string elementName, string elementNs, XmlSchemaSet schemaSet, bool skipSchemaExport)
  360. {
  361. #if DEBUG
  362. Fx.Assert(NamingHelper.IsValidNCName(elementName), "Name value has to be a valid NCName.");
  363. #endif
  364. AddMessagePart(message, "parameters", new XmlQualifiedName(elementName, elementNs), XmlQualifiedName.Empty);
  365. if (skipSchemaExport)
  366. return emptySequence; //return empty to denote it is wrapped part
  367. XmlSchemaElement wrapperGlobalElement = new XmlSchemaElement();
  368. wrapperGlobalElement.Name = elementName;
  369. XmlSchemaComplexType wrapperType = new XmlSchemaComplexType();
  370. wrapperGlobalElement.SchemaType = wrapperType; // generating an anonymous type for wrapper
  371. XmlSchemaSequence rootSequence = new XmlSchemaSequence();
  372. wrapperType.Particle = rootSequence;
  373. AddElementToSchema(wrapperGlobalElement, elementNs, schemaSet);
  374. return rootSequence;
  375. }
  376. protected bool CreateMessage(MessageDescription message, int messageIndex, out WsdlNS.Message wsdlMessage)
  377. {
  378. wsdlMessage = null;
  379. bool isNewMessage = true;
  380. if (ExportedMessages.WsdlMessages.ContainsKey(new MessageDescriptionDictionaryKey(contractContext.Contract, message)))
  381. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.MultipleCallsToExportContractWithSameContract)));
  382. TypedMessageKey typedMessageKey = null;
  383. OperationMessageKey messageKey = null;
  384. if (message.IsTypedMessage)
  385. {
  386. typedMessageKey = new TypedMessageKey(message.MessageType, operation.DeclaringContract.Namespace, this.GetExtensionData());
  387. if (ExportedMessages.TypedMessages.TryGetValue(typedMessageKey, out wsdlMessage))
  388. isNewMessage = false;
  389. }
  390. else if (operation.OperationMethod != null)
  391. {
  392. messageKey = new OperationMessageKey(operation, messageIndex);
  393. if (ExportedMessages.ParameterMessages.TryGetValue(messageKey, out wsdlMessage))
  394. isNewMessage = false;
  395. }
  396. WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
  397. if (isNewMessage)
  398. {
  399. wsdlMessage = new WsdlNS.Message();
  400. wsdlMessage.Name = GetMessageName(message);
  401. wsdl.Messages.Add(wsdlMessage);
  402. if (message.IsTypedMessage)
  403. ExportedMessages.TypedMessages.Add(typedMessageKey, wsdlMessage);
  404. else if (messageKey != null)
  405. ExportedMessages.ParameterMessages.Add(messageKey, wsdlMessage);
  406. }
  407. //Add Name to OperationMessage
  408. WsdlNS.OperationMessage wsdlOperationMessage = contractContext.GetOperationMessage(message);
  409. wsdlOperationMessage.Message = new XmlQualifiedName(wsdlMessage.Name, wsdlMessage.ServiceDescription.TargetNamespace);
  410. this.ExportedMessages.WsdlMessages.Add(new MessageDescriptionDictionaryKey(contractContext.Contract, message), wsdlMessage);
  411. return isNewMessage;
  412. }
  413. protected bool CreateHeaderMessage(MessageDescription message, out WsdlNS.Message wsdlMessage)
  414. {
  415. wsdlMessage = null;
  416. if (ExportedMessages.WsdlHeaderMessages.ContainsKey(new MessageDescriptionDictionaryKey(contractContext.Contract, message)))
  417. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.MultipleCallsToExportContractWithSameContract)));
  418. TypedMessageKey typedMessageKey = null;
  419. if (message.IsTypedMessage)
  420. {
  421. typedMessageKey = new TypedMessageKey(message.MessageType, operation.DeclaringContract.Namespace, GetExtensionData());
  422. if (ExportedMessages.TypedHeaderMessages.TryGetValue(typedMessageKey, out wsdlMessage))
  423. {
  424. this.ExportedMessages.WsdlHeaderMessages.Add(new MessageDescriptionDictionaryKey(contractContext.Contract, message), wsdlMessage);
  425. return false;
  426. }
  427. }
  428. string messageName = GetHeaderMessageName(message);
  429. wsdlMessage = new WsdlNS.Message();
  430. wsdlMessage.Name = messageName;
  431. contractContext.WsdlPortType.ServiceDescription.Messages.Add(wsdlMessage);
  432. if (message.IsTypedMessage)
  433. ExportedMessages.TypedHeaderMessages.Add(typedMessageKey, wsdlMessage);
  434. this.ExportedMessages.WsdlHeaderMessages.Add(new MessageDescriptionDictionaryKey(contractContext.Contract, message), wsdlMessage);
  435. return true;
  436. }
  437. string GetMessageName(MessageDescription messageDescription)
  438. {
  439. string messageNameBase = XmlName.IsNullOrEmpty(messageDescription.MessageName) ? null : messageDescription.MessageName.EncodedName;
  440. //If there wasn't one in the Message Description we create one.
  441. if (string.IsNullOrEmpty(messageNameBase))
  442. {
  443. string portTypeName = contractContext.WsdlPortType.Name;
  444. string operationName = contractContext.GetOperation(operation).Name;
  445. string callbackString = operation.IsServerInitiated() ? "Callback" : string.Empty;
  446. // [....]: composing names have potential problem of generating name that looks like an encoded name, consider avoiding '_'
  447. if (messageDescription.Direction == MessageDirection.Input)
  448. messageNameBase = string.Format(System.Globalization.CultureInfo.InvariantCulture,
  449. "{0}_{1}_Input{2}Message", portTypeName, operationName, callbackString);
  450. else
  451. messageNameBase = string.Format(System.Globalization.CultureInfo.InvariantCulture,
  452. "{0}_{1}_Output{2}Message", portTypeName, operationName, callbackString);
  453. }
  454. WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
  455. return GetUniqueMessageName(wsdl, messageNameBase);
  456. }
  457. string GetHeaderMessageName(MessageDescription messageDescription)
  458. {
  459. WsdlNS.Message wsdlBodyMessage = this.ExportedMessages.WsdlMessages[new MessageDescriptionDictionaryKey(this.contractContext.Contract, messageDescription)];
  460. string messageNameBase = string.Format(System.Globalization.CultureInfo.InvariantCulture,
  461. "{0}_Headers", wsdlBodyMessage.Name);
  462. WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
  463. return GetUniqueMessageName(wsdl, messageNameBase);
  464. }
  465. protected string GetFaultMessageName(string faultName)
  466. {
  467. string portTypeName = contractContext.WsdlPortType.Name;
  468. string operationName = contractContext.GetOperation(operation).Name;
  469. // [....]: composing names have potential problem of generating name that looks like an encoded name, consider avoiding '_'
  470. string faultNameBase = String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}_{1}_{2}_FaultMessage", portTypeName, operationName, faultName);
  471. WsdlNS.ServiceDescription wsdl = contractContext.WsdlPortType.ServiceDescription;
  472. return GetUniqueMessageName(wsdl, faultNameBase);
  473. }
  474. static bool DoesMessageNameExist(string messageName, object wsdlObject)
  475. {
  476. return ((WsdlNS.ServiceDescription)wsdlObject).Messages[messageName] != null;
  477. }
  478. string GetUniqueMessageName(WsdlNS.ServiceDescription wsdl, string messageNameBase)
  479. {
  480. return NamingHelper.GetUniqueName(messageNameBase, DoesMessageNameExist, wsdl);
  481. }
  482. 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)
  483. {
  484. if (IsNullOrEmpty(typeName) && xsdType == null)
  485. return;
  486. #if DEBUG
  487. if (xsdType == null)
  488. Fx.Assert(NamingHelper.IsValidNCName(typeName.Name), "Name value has to be a valid NCName.");
  489. #endif
  490. string elementName = part.Name;
  491. string partName = string.IsNullOrEmpty(part.UniquePartName) ? elementName : part.UniquePartName;
  492. WsdlNS.MessagePart wsdlPart = null;
  493. if (generateElement)
  494. {
  495. if (wrapperSequence != null)
  496. {
  497. if (!skipSchemaExport)
  498. ExportLocalElement(wrapperNs, partName, part.Namespace, typeName, xsdType, part.Multiple, isOptional, isNillable, wrapperSequence, schemaSet);
  499. }
  500. else
  501. {
  502. if (!skipSchemaExport)
  503. ExportGlobalElement(elementName, part.Namespace, isNillable, typeName, xsdType, schemaSet);
  504. wsdlPart = AddMessagePart(message, partName, new XmlQualifiedName(elementName, part.Namespace), XmlQualifiedName.Empty);
  505. }
  506. }
  507. else
  508. {
  509. if (String.IsNullOrEmpty(typeName.Name))
  510. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxAnonymousTypeNotSupported, message.Name, partName)));
  511. wsdlPart = AddMessagePart(message, partName, XmlQualifiedName.Empty, typeName);
  512. }
  513. if (wsdlPart != null)
  514. {
  515. part.UniquePartName = wsdlPart.Name;
  516. }
  517. }
  518. protected void AddParameterOrder(MessageDescription message)
  519. {
  520. if (operation == null)
  521. return;
  522. WsdlNS.Operation wsdlOperation = contractContext.GetOperation(operation);
  523. if (wsdlOperation != null)
  524. {
  525. if (wsdlOperation.ParameterOrder == null)
  526. {
  527. wsdlOperation.ParameterOrder = new string[GetParameterCount()];
  528. }
  529. if (wsdlOperation.ParameterOrder.Length == 0)
  530. return;
  531. foreach (MessagePartDescription part in message.Body.Parts)
  532. {
  533. ParameterInfo paramInfo = part.AdditionalAttributesProvider as ParameterInfo;
  534. if (paramInfo != null && paramInfo.Position >= 0)
  535. wsdlOperation.ParameterOrder[paramInfo.Position] = part.Name;
  536. }
  537. }
  538. }
  539. int GetParameterCount()
  540. {
  541. int count = -1;
  542. foreach (MessageDescription message in operation.Messages)
  543. {
  544. foreach (MessagePartDescription part in message.Body.Parts)
  545. {
  546. ParameterInfo paramInfo = part.AdditionalAttributesProvider as ParameterInfo;
  547. if (paramInfo == null)
  548. return 0;
  549. if (count < paramInfo.Position)
  550. count = paramInfo.Position;
  551. }
  552. }
  553. return count + 1;
  554. }
  555. protected virtual void Compile()
  556. {
  557. foreach (XmlSchema schema in SchemaSet.Schemas())
  558. SchemaSet.Reprocess(schema);
  559. SchemaHelper.Compile(SchemaSet, exporter.Errors);
  560. }
  561. class MessageBindingExporter
  562. {
  563. WsdlEndpointConversionContext endpointContext;
  564. MessageExportContext exportedMessages;
  565. EnvelopeVersion soapVersion;
  566. WsdlExporter exporter;
  567. internal MessageBindingExporter(WsdlExporter exporter, WsdlEndpointConversionContext endpointContext)
  568. {
  569. this.endpointContext = endpointContext;
  570. this.exportedMessages = (MessageExportContext)exporter.State[typeof(MessageExportContext)];
  571. this.soapVersion = SoapHelper.GetSoapVersion(endpointContext.WsdlBinding);
  572. this.exporter = exporter;
  573. }
  574. internal void ExportMessageBinding(OperationDescription operation, Type messageContractExporterType)
  575. {
  576. WsdlNS.OperationBinding wsdlOperationBinding = endpointContext.GetOperationBinding(operation);
  577. bool isRpc, isEncoded;
  578. if (!GetStyleAndUse(operation, messageContractExporterType, out isRpc, out isEncoded))
  579. return;
  580. WsdlNS.SoapOperationBinding soapOperationBinding = SoapHelper.GetOrCreateSoapOperationBinding(endpointContext, operation, exporter);
  581. if (soapOperationBinding == null)
  582. return;
  583. soapOperationBinding.Style = isRpc ? WsdlNS.SoapBindingStyle.Rpc : WsdlNS.SoapBindingStyle.Document;
  584. if (isRpc)
  585. {
  586. WsdlNS.SoapBinding soapBinding = (WsdlNS.SoapBinding)endpointContext.WsdlBinding.Extensions.Find(typeof(WsdlNS.SoapBinding));
  587. soapBinding.Style = soapOperationBinding.Style;
  588. }
  589. soapOperationBinding.SoapAction = operation.Messages[0].Action;
  590. foreach (MessageDescription message in operation.Messages)
  591. {
  592. WsdlNS.MessageBinding wsdlMessageBinding = endpointContext.GetMessageBinding(message);
  593. WsdlNS.Message headerMessage;
  594. if (this.exportedMessages.WsdlHeaderMessages.TryGetValue(new MessageDescriptionDictionaryKey(this.endpointContext.Endpoint.Contract, message), out headerMessage))
  595. {
  596. XmlQualifiedName wsdlHeaderMessageName = new XmlQualifiedName(headerMessage.Name, headerMessage.ServiceDescription.TargetNamespace);
  597. foreach (MessageHeaderDescription header in message.Headers)
  598. {
  599. if (header.IsUnknownHeaderCollection)
  600. continue;
  601. ExportMessageHeaderBinding(header, wsdlHeaderMessageName, isEncoded, wsdlMessageBinding);
  602. }
  603. }
  604. ExportMessageBodyBinding(message, isRpc, isEncoded, wsdlMessageBinding);
  605. }
  606. foreach (FaultDescription fault in operation.Faults)
  607. {
  608. ExportFaultBinding(fault, isEncoded, wsdlOperationBinding);
  609. }
  610. }
  611. void ExportFaultBinding(FaultDescription fault, bool isEncoded, WsdlNS.OperationBinding operationBinding)
  612. {
  613. SoapHelper.CreateSoapFaultBinding(fault.Name, endpointContext, endpointContext.GetFaultBinding(fault), isEncoded);
  614. }
  615. void ExportMessageBodyBinding(MessageDescription messageDescription, bool isRpc, bool isEncoded, WsdlNS.MessageBinding messageBinding)
  616. {
  617. WsdlNS.SoapBodyBinding bodyBinding = SoapHelper.GetOrCreateSoapBodyBinding(endpointContext, messageBinding, exporter);
  618. if (bodyBinding == null)
  619. return;
  620. bodyBinding.Use = isEncoded ? WsdlNS.SoapBindingUse.Encoded : WsdlNS.SoapBindingUse.Literal;
  621. if (isRpc)
  622. {
  623. string ns;
  624. if (!ExportedMessages.WrapperNamespaces.TryGetValue(new MessageDescriptionDictionaryKey(endpointContext.ContractConversionContext.Contract, messageDescription), out ns))
  625. ns = messageDescription.Body.WrapperNamespace;
  626. bodyBinding.Namespace = ns;
  627. }
  628. if (isEncoded)
  629. bodyBinding.Encoding = XmlSerializerOperationFormatter.GetEncoding(soapVersion);
  630. }
  631. void ExportMessageHeaderBinding(MessageHeaderDescription header, XmlQualifiedName messageName, bool isEncoded, WsdlNS.MessageBinding messageBinding)
  632. {
  633. #if DEBUG
  634. Fx.Assert(NamingHelper.IsValidNCName(messageName.Name), "Name value has to be a valid NCName.");
  635. #endif
  636. WsdlNS.SoapHeaderBinding headerBinding = SoapHelper.CreateSoapHeaderBinding(endpointContext, messageBinding);
  637. headerBinding.Part = string.IsNullOrEmpty(header.UniquePartName) ? header.Name : header.UniquePartName;
  638. headerBinding.Message = messageName;
  639. headerBinding.Use = isEncoded ? WsdlNS.SoapBindingUse.Encoded : WsdlNS.SoapBindingUse.Literal;
  640. if (isEncoded)
  641. headerBinding.Encoding = XmlSerializerOperationFormatter.GetEncoding(soapVersion);
  642. }
  643. static bool GetStyleAndUse(OperationDescription operation, Type messageContractExporterType, out bool isRpc, out bool isEncoded)
  644. {
  645. isRpc = isEncoded = false;
  646. if (messageContractExporterType == typeof(DataContractSerializerMessageContractExporter) || messageContractExporterType == null)
  647. {
  648. DataContractSerializerOperationBehavior dataContractSerializerBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();
  649. if (dataContractSerializerBehavior != null)
  650. {
  651. isRpc = dataContractSerializerBehavior.DataContractFormatAttribute.Style == OperationFormatStyle.Rpc;
  652. isEncoded = false;
  653. return true;
  654. }
  655. if (messageContractExporterType == typeof(DataContractSerializerMessageContractExporter))
  656. return false;
  657. }
  658. if (messageContractExporterType == typeof(XmlSerializerMessageContractExporter) || messageContractExporterType == null)
  659. {
  660. XmlSerializerOperationBehavior xmlSerializerBehavior = operation.Behaviors.Find<XmlSerializerOperationBehavior>();
  661. if (xmlSerializerBehavior != null)
  662. {
  663. isRpc = xmlSerializerBehavior.XmlSerializerFormatAttribute.Style == OperationFormatStyle.Rpc;
  664. isEncoded = xmlSerializerBehavior.XmlSerializerFormatAttribute.IsEncoded;
  665. return true;
  666. }
  667. return false;
  668. }
  669. return false;
  670. }
  671. MessageExportContext ExportedMessages
  672. {
  673. get { return GetMessageExportContext(exporter); }
  674. }
  675. }
  676. protected class MessageExportContext
  677. {
  678. readonly internal Dictionary<MessageDescriptionDictionaryKey, WsdlNS.Message> WsdlMessages = new Dictionary<MessageDescriptionDictionaryKey, System.Web.Services.Description.Message>();
  679. readonly internal Dictionary<MessageDescriptionDictionaryKey, WsdlNS.Message> WsdlHeaderMessages = new Dictionary<MessageDescriptionDictionaryKey, System.Web.Services.Description.Message>();
  680. readonly internal Dictionary<MessageDescriptionDictionaryKey, string> WrapperNamespaces = new Dictionary<MessageDescriptionDictionaryKey, string>();
  681. readonly internal Dictionary<TypedMessageKey, WsdlNS.Message> TypedMessages = new Dictionary<TypedMessageKey, WsdlNS.Message>();
  682. readonly internal Dictionary<TypedMessageKey, WsdlNS.Message> TypedHeaderMessages = new Dictionary<TypedMessageKey, WsdlNS.Message>();
  683. readonly internal Dictionary<OperationMessageKey, WsdlNS.Message> ParameterMessages = new Dictionary<OperationMessageKey, WsdlNS.Message>();
  684. readonly internal Dictionary<XmlQualifiedName, OperationElement> ElementTypes = new Dictionary<XmlQualifiedName, OperationElement>();
  685. }
  686. protected sealed class MessageDescriptionDictionaryKey
  687. {
  688. public readonly ContractDescription Contract;
  689. public readonly MessageDescription MessageDescription;
  690. public MessageDescriptionDictionaryKey(ContractDescription contract, MessageDescription MessageDescription)
  691. {
  692. this.Contract = contract;
  693. this.MessageDescription = MessageDescription;
  694. }
  695. public override bool Equals(object obj)
  696. {
  697. MessageDescriptionDictionaryKey key = obj as MessageDescriptionDictionaryKey;
  698. if (key != null && key.MessageDescription == this.MessageDescription && key.Contract == this.Contract)
  699. return true;
  700. return false;
  701. }
  702. public override int GetHashCode()
  703. {
  704. return this.Contract.GetHashCode() ^ this.MessageDescription.GetHashCode();
  705. }
  706. }
  707. internal sealed class TypedMessageKey
  708. {
  709. Type type;
  710. string contractNS;
  711. object extensionData;
  712. public TypedMessageKey(Type type, string contractNS, object extensionData)
  713. {
  714. this.type = type;
  715. this.contractNS = contractNS;
  716. this.extensionData = extensionData;
  717. }
  718. public override bool Equals(object obj)
  719. {
  720. TypedMessageKey key = obj as TypedMessageKey;
  721. if (key != null && key.type == this.type &&
  722. key.contractNS == this.contractNS &&
  723. key.extensionData.Equals(this.extensionData))
  724. return true;
  725. return false;
  726. }
  727. [SuppressMessage(FxCop.Category.Usage, "CA2303:FlagTypeGetHashCode", Justification = "The hashcode is not used for identity purposes for embedded types.")]
  728. public override int GetHashCode()
  729. {
  730. return type.GetHashCode();
  731. }
  732. }
  733. internal sealed class OperationMessageKey
  734. {
  735. MethodInfo methodInfo;
  736. int messageIndex;
  737. ContractDescription declaringContract;
  738. public OperationMessageKey(OperationDescription operation, int messageIndex)
  739. {
  740. this.methodInfo = operation.OperationMethod;
  741. this.messageIndex = messageIndex;
  742. this.declaringContract = operation.DeclaringContract;
  743. }
  744. public override bool Equals(object obj)
  745. {
  746. OperationMessageKey key = obj as OperationMessageKey;
  747. if (key != null && key.methodInfo == this.methodInfo &&
  748. key.messageIndex == this.messageIndex &&
  749. key.declaringContract.Name == this.declaringContract.Name &&
  750. key.declaringContract.Namespace == this.declaringContract.Namespace)
  751. return true;
  752. return false;
  753. }
  754. public override int GetHashCode()
  755. {
  756. return methodInfo.GetHashCode() ^ messageIndex;
  757. }
  758. }
  759. internal sealed class OperationElement
  760. {
  761. XmlSchemaElement element;
  762. OperationDescription operation;
  763. internal OperationElement(XmlSchemaElement element, OperationDescription operation)
  764. {
  765. this.element = element;
  766. this.operation = operation;
  767. }
  768. internal XmlSchemaElement Element { get { return element; } }
  769. internal OperationDescription Operation { get { return operation; } }
  770. }
  771. }
  772. class DataContractSerializerMessageContractExporter : MessageContractExporter
  773. {
  774. internal DataContractSerializerMessageContractExporter(WsdlExporter exporter, WsdlContractConversionContext context, OperationDescription operation, IOperationBehavior extension)
  775. : base(exporter, context, operation, extension)
  776. {
  777. }
  778. protected override void Compile()
  779. {
  780. XmlSchema wsdl = StockSchemas.CreateWsdl();
  781. XmlSchema soap = StockSchemas.CreateSoap();
  782. XmlSchema soapEncoding = StockSchemas.CreateSoapEncoding();
  783. XmlSchema fakeXsdSchema = StockSchemas.CreateFakeXsdSchema();
  784. SchemaSet.Add(wsdl);
  785. SchemaSet.Add(soap);
  786. SchemaSet.Add(soapEncoding);
  787. SchemaSet.Add(fakeXsdSchema);
  788. base.Compile();
  789. SchemaSet.Remove(wsdl);
  790. SchemaSet.Remove(soap);
  791. SchemaSet.Remove(soapEncoding);
  792. SchemaSet.Remove(fakeXsdSchema);
  793. }
  794. protected override bool IsRpcStyle()
  795. {
  796. return ((DataContractSerializerOperationBehavior)extension).DataContractFormatAttribute.Style == OperationFormatStyle.Rpc;
  797. }
  798. protected override bool IsEncoded()
  799. {
  800. return false;
  801. }
  802. protected override object OnExportMessageContract()
  803. {
  804. return null;
  805. }
  806. protected override void ExportHeaders(int messageIndex, object state)
  807. {
  808. MessageDescription description = operation.Messages[messageIndex];
  809. if (description.Headers.Count > 0)
  810. {
  811. WsdlNS.Message wsdlMessage;
  812. if (CreateHeaderMessage(description, out wsdlMessage))
  813. {
  814. foreach (MessageHeaderDescription header in description.Headers)
  815. {
  816. if (header.IsUnknownHeaderCollection)
  817. continue;
  818. XmlSchemaType xsdType;
  819. bool isQueryable;
  820. Type dataContractType = DataContractSerializerOperationFormatter.GetSubstituteDataContractType(header.Type, out isQueryable);
  821. XmlQualifiedName typeName = ExportType(dataContractType, header.Name, operation.Name, out xsdType);
  822. ExportMessagePart(wsdlMessage, header, typeName, xsdType, true/*isOptional*/, IsTypeNullable(header.Type), false/*IsOperationInherited(operation)*/, true /*generateElement*/, null/*wrapperNamespace*/, null/*wrapperSequence*/, SchemaSet);
  823. }
  824. }
  825. }
  826. }
  827. static internal bool IsTypeNullable(Type type)
  828. {
  829. return !type.IsValueType ||
  830. (type.IsGenericType &&
  831. type.GetGenericTypeDefinition() == typeof(Nullable<>));
  832. }
  833. protected override void ExportBody(int messageIndex, object state)
  834. {
  835. MessageDescription description = operation.Messages[messageIndex];
  836. WsdlNS.Message wsdlMessage = this.ExportedMessages.WsdlMessages[new MessageDescriptionDictionaryKey(this.contractContext.Contract, description)];
  837. DataContractFormatAttribute dataContractFormatAttribute = ((DataContractSerializerOperationBehavior)extension).DataContractFormatAttribute;
  838. XmlSchemaSequence wrapperSequence = null;
  839. bool isWrapped = description.Body.WrapperName != null;
  840. //bool isOperationInherited = IsOperationInherited(operation);
  841. if (dataContractFormatAttribute.Style == OperationFormatStyle.Document && isWrapped)
  842. wrapperSequence = ExportWrappedPart(wsdlMessage, description.Body.WrapperName, description.Body.WrapperNamespace, SchemaSet, false /*isOperationInherited*/);
  843. XmlSchemaType xsdType;
  844. if (OperationFormatter.IsValidReturnValue(description.Body.ReturnValue))
  845. {
  846. bool isQueryable;
  847. Type dataContractType = DataContractSerializerOperationFormatter.GetSubstituteDataContractType(description.Body.ReturnValue.Type, out isQueryable);
  848. XmlQualifiedName typeName = ExportType(dataContractType, description.Body.ReturnValue.Name, operation.Name, out xsdType);
  849. 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);
  850. }
  851. foreach (MessagePartDescription bodyPart in description.Body.Parts)
  852. {
  853. bool isQueryable;
  854. Type dataContractType = DataContractSerializerOperationFormatter.GetSubstituteDataContractType(bodyPart.Type, out isQueryable);
  855. XmlQualifiedName typeName = ExportType(dataContractType, bodyPart.Name, operation.Name, out xsdType);
  856. ExportMessagePart(wsdlMessage, bodyPart, typeName, xsdType, true/*isOptional*/, IsTypeNullable(bodyPart.Type), false/*isOperationInherited*/, dataContractFormatAttribute.Style != OperationFormatStyle.Rpc, description.Body.WrapperNamespace, wrapperSequence, SchemaSet);
  857. }
  858. if (dataContractFormatAttribute.Style == OperationFormatStyle.Rpc)
  859. {
  860. AddParameterOrder(description);
  861. }
  862. }
  863. protected override void ExportKnownTypes()
  864. {
  865. foreach (Type knownType in operation.KnownTypes)
  866. {
  867. DataContractExporter.Export(knownType);
  868. }
  869. }
  870. protected override object GetExtensionData()
  871. {
  872. return new ExtensionData(((DataContractSerializerOperationBehavior)extension).DataContractFormatAttribute);
  873. }
  874. class ExtensionData
  875. {
  876. DataContractFormatAttribute dcFormatAttr;
  877. internal ExtensionData(DataContractFormatAttribute dcFormatAttr)
  878. {
  879. this.dcFormatAttr = dcFormatAttr;
  880. }
  881. public override bool Equals(object obj)
  882. {
  883. if (object.ReferenceEquals(dcFormatAttr, obj))
  884. return true;
  885. ExtensionData otherExtensionData = obj as ExtensionData;
  886. if (otherExtensionData == null)
  887. return false;
  888. return dcFormatAttr.Style == otherExtensionData.dcFormatAttr.Style;
  889. }
  890. public override int GetHashCode()
  891. {
  892. return 1; //This is never called
  893. }
  894. }
  895. }
  896. class XmlSerializerMessageContractExporter : MessageContractExporter
  897. {
  898. internal XmlSerializerMessageContractExporter(WsdlExporter exporter, WsdlContractConversionContext context, OperationDescription operation, IOperationBehavior extension)
  899. : base(exporter, context, operation, extension)
  900. {
  901. }
  902. protected override bool IsRpcStyle()
  903. {
  904. return ((XmlSerializerOperationBehavior)extension).XmlSerializerFormatAttribute.Style == OperationFormatStyle.Rpc;
  905. }
  906. protected override bool IsEncoded()
  907. {
  908. return ((XmlSerializerOperationBehavior)extension).XmlSerializerFormatAttribute.IsEncoded;
  909. }
  910. protected override object OnExportMessageContract()
  911. {
  912. object result = Reflector.ReflectOperation(operation);
  913. if (result == null)
  914. {
  915. // If result is null, that means that XmlSerializerFormatAttribute wasn't available in reflection,
  916. // so we need to get it from the XmlSerializerOperationBehavior instead
  917. XmlSerializerOperationBehavior serializerBehavior = this.extension as XmlSerializerOperationBehavior;
  918. if (serializerBehavior != null)
  919. {
  920. result = Reflector.ReflectOperation(operation, serializerBehavior.XmlSerializerFormatAttribute);
  921. }
  922. }
  923. return result;
  924. }
  925. protected override void ExportHeaders(int messageIndex, object state)
  926. {
  927. string portTypeName = contractContext.WsdlPortType.Name;
  928. string portTypeNs = contractContext.WsdlPortType.ServiceDescription.TargetNamespace;
  929. MessageDescription description = operation.Messages[messageIndex];
  930. if (description.Headers.Count > 0)
  931. {
  932. XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector = (XmlSerializerOperationBehavior.Reflector.OperationReflector)state;
  933. XmlMembersMapping membersMapping = null;
  934. if (messageIndex == 0)
  935. {
  936. membersMapping = operationReflector.Request.HeadersMapping;
  937. }
  938. else
  939. {
  940. membersMapping = operationReflector.Reply.HeadersMapping;
  941. }
  942. if (membersMapping != null)
  943. {
  944. WsdlNS.Message wsdlMessage;
  945. if (CreateHeaderMessage(description, out wsdlMessage))
  946. {
  947. ExportMembersMapping(membersMapping, wsdlMessage, false /*IsOperationInherited(operation)*/, operationReflector.IsEncoded, false/*isRpc*/, false/*isWrapped*/, true/*isHeader*/);
  948. }
  949. }
  950. }
  951. }
  952. protected override void ExportBody(int messageIndex, object state)
  953. {
  954. MessageDescription description = operation.Messages[messageIndex];
  955. string portTypeName = contractContext.WsdlPortType.Name;
  956. string portTypeNs = contractContext.WsdlPortType.ServiceDescription.TargetNamespace;
  957. MessageDescriptionDictionaryKey key = new MessageDescriptionDictionaryKey(this.contractContext.Contract, description);
  958. WsdlNS.Message wsdlMessage = this.ExportedMessages.WsdlMessages[key];
  959. XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector = (XmlSerializerOperationBehavior.Reflector.OperationReflector)state;
  960. XmlMembersMapping membersMapping = null;
  961. if (messageIndex == 0)
  962. {
  963. membersMapping = operationReflector.Request.BodyMapping;
  964. }
  965. else
  966. {
  967. membersMapping = operationReflector.Reply.BodyMapping;
  968. }
  969. if (membersMapping != null)
  970. {
  971. bool isDocWrapped = !operationReflector.IsRpc && description.Body.WrapperName != null;
  972. ExportMembersMapping(membersMapping, wsdlMessage, false /*IsOperationInherited(operation)*/, operationReflector.IsEncoded, operationReflector.IsRpc, isDocWrapped, false/*isHeader*/);
  973. if (operationReflector.IsRpc)
  974. {
  975. AddParameterOrder(operation.Messages[messageIndex]);
  976. this.ExportedMessages.WrapperNamespaces.Add(key, membersMapping.Namespace);
  977. }
  978. }
  979. }
  980. protected override void ExportFaults(object state)
  981. {
  982. XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector = (XmlSerializerOperationBehavior.Reflector.OperationReflector)state;
  983. if (operationReflector.Attribute.SupportFaults)
  984. {
  985. foreach (FaultDescription fault in operation.Faults)
  986. {
  987. ExportFault(fault, operationReflector);
  988. }
  989. Compile();
  990. }
  991. else
  992. {
  993. base.ExportFaults(state);
  994. }
  995. }
  996. void ExportFault(FaultDescription fault, XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector)
  997. {
  998. WsdlNS.Message faultMessage = new WsdlNS.Message();
  999. faultMessage.Name = GetFaultMessageName(fault.Name);
  1000. XmlQualifiedName elementName = ExportFaultElement(fault, operationReflector);
  1001. this.contractContext.WsdlPortType.ServiceDescription.Messages.Add(faultMessage);
  1002. AddMessagePart(faultMessage, "detail", elementName, null);
  1003. // create a wsdl:fault to put inside the wsdl:portType/wsdl:operation
  1004. WsdlNS.OperationFault operationFault = contractContext.GetOperationFault(fault);
  1005. WsdlExporter.WSAddressingHelper.AddActionAttribute(fault.Action, operationFault, this.exporter.PolicyVersion);
  1006. operationFault.Message = new XmlQualifiedName(faultMessage.Name, faultMessage.ServiceDescription.TargetNamespace);
  1007. }
  1008. XmlQualifiedName ExportFaultElement(FaultDescription fault, XmlSerializerOperationBehavior.Reflector.OperationReflector operationReflector)
  1009. {
  1010. XmlQualifiedName elementName;
  1011. XmlMembersMapping mapping = operationReflector.ImportFaultElement(fault, out elementName);
  1012. if (operationReflector.IsEncoded)
  1013. SoapExporter.ExportMembersMapping(mapping);
  1014. else
  1015. XmlExporter.ExportMembersMapping(mapping);
  1016. return elementName;
  1017. }
  1018. protected override void ExportKnownTypes()
  1019. {
  1020. }
  1021. protected override object GetExtensionData()
  1022. {
  1023. return new ExtensionData(((XmlSerializerOperationBehavior)this.extension).XmlSerializerFormatAttribute);
  1024. }
  1025. class ExtensionData
  1026. {
  1027. XmlSerializerFormatAttribute xsFormatAttr;
  1028. internal ExtensionData(XmlSerializerFormatAttribute xsFormatAttr)
  1029. {
  1030. this.xsFormatAttr = xsFormatAttr;
  1031. }
  1032. public override bool Equals(object obj)
  1033. {
  1034. if (object.ReferenceEquals(xsFormatAttr, obj))
  1035. return true;
  1036. ExtensionData otherExtensionData = obj as ExtensionData;
  1037. if (otherExtensionData == null)
  1038. return false;
  1039. return xsFormatAttr.Style == otherExtensionData.xsFormatAttr.Style &&
  1040. xsFormatAttr.Use == otherExtensionData.xsFormatAttr.Use;
  1041. }
  1042. public override int GetHashCode()
  1043. {
  1044. return 1; //This is never called
  1045. }
  1046. }
  1047. void ExportMembersMapping(XmlMembersMapping membersMapping, WsdlNS.Message message, bool skipSchemaExport, bool isEncoded, bool isRpc, bool isDocWrapped, bool isHeader)
  1048. {
  1049. if (!skipSchemaExport)
  1050. {
  1051. if (isEncoded)
  1052. SoapExporter.ExportMembersMapping(membersMapping);
  1053. else
  1054. XmlExporter.ExportMembersMapping(membersMapping, !isRpc);
  1055. }
  1056. if (isDocWrapped)
  1057. {
  1058. if (isHeader)
  1059. {
  1060. Fx.Assert("Header cannot be Document Wrapped");
  1061. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Header cannot be Document Wrapped")));
  1062. }
  1063. AddMessagePart(message, "parameters", new XmlQualifiedName(membersMapping.XsdElementName, membersMapping.Namespace), XmlQualifiedName.Empty);
  1064. return;
  1065. }
  1066. bool generateElement = !isRpc && !isEncoded;
  1067. for (int i = 0; i < membersMapping.Count; i++)
  1068. {
  1069. XmlMemberMapping member = membersMapping[i];
  1070. string partName = (isHeader || generateElement) ? NamingHelper.XmlName(member.MemberName) : member.XsdElementName;
  1071. if (generateElement)
  1072. AddMessagePart(message, partName, new XmlQualifiedName(member.XsdElementName, member.Namespace), XmlQualifiedName.Empty);
  1073. else
  1074. {
  1075. if (string.IsNullOrEmpty(member.TypeName))
  1076. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxAnonymousTypeNotSupported, message.Name, partName)));
  1077. AddMessagePart(message, partName, XmlQualifiedName.Empty, new XmlQualifiedName(member.TypeName, member.TypeNamespace));
  1078. }
  1079. }
  1080. }
  1081. XmlSerializerOperationBehavior.Reflector Reflector
  1082. {
  1083. get
  1084. {
  1085. object reflector;
  1086. if (!exporter.State.TryGetValue(typeof(XmlSerializerOperationBehavior.Reflector), out reflector))
  1087. {
  1088. reflector = new XmlSerializerOperationBehavior.Reflector(contractContext.Contract.Namespace, contractContext.Contract.ContractType);
  1089. exporter.State.Add(typeof(XmlSerializerOperationBehavior.Reflector), reflector);
  1090. }
  1091. return (XmlSerializerOperationBehavior.Reflector)reflector;
  1092. }
  1093. }
  1094. SoapSchemaExporter SoapExporter
  1095. {
  1096. get
  1097. {
  1098. object soapExporter;
  1099. if (!exporter.State.TryGetValue(typeof(SoapSchemaExporter), out soapExporter))
  1100. {
  1101. soapExporter = new SoapSchemaExporter(Schemas);
  1102. exporter.State.Add(typeof(SoapSchemaExporter), soapExporter);
  1103. }
  1104. return (SoapSchemaExporter)soapExporter;
  1105. }
  1106. }
  1107. XmlSchemaExporter XmlExporter
  1108. {
  1109. get
  1110. {
  1111. object xmlExporter;
  1112. if (!exporter.State.TryGetValue(typeof(XmlSchemaExporter), out xmlExporter))
  1113. {
  1114. xmlExporter = new XmlSchemaExporter(Schemas);
  1115. exporter.State.Add(typeof(XmlSchemaExporter), xmlExporter);
  1116. }
  1117. return (XmlSchemaExporter)xmlExporter;
  1118. }
  1119. }
  1120. XmlSchemas Schemas
  1121. {
  1122. get
  1123. {
  1124. object schemas;
  1125. if (!exporter.State.TryGetValue(typeof(XmlSchemas), out schemas))
  1126. {
  1127. schemas = new XmlSchemas();
  1128. foreach (XmlSchema schema in this.SchemaSet.Schemas())
  1129. if (!((XmlSchemas)schemas).Contains(schema.TargetNamespace))
  1130. ((XmlSchemas)schemas).Add(schema);
  1131. exporter.State.Add(typeof(XmlSchemas), schemas);
  1132. }
  1133. return (XmlSchemas)schemas;
  1134. }
  1135. }
  1136. protected override void Compile()
  1137. {
  1138. XmlSchema wsdl = StockSchemas.CreateWsdl();
  1139. XmlSchema soap = StockSchemas.CreateSoap();
  1140. XmlSchema soapEncoding = StockSchemas.CreateSoapEncoding();
  1141. XmlSchema fakeXsdSchema = StockSchemas.CreateFakeXsdSchema();
  1142. MoveSchemas();
  1143. SchemaSet.Add(wsdl);
  1144. SchemaSet.Add(soap);
  1145. SchemaSet.Add(soapEncoding);
  1146. SchemaSet.Add(fakeXsdSchema);
  1147. base.Compile();
  1148. SchemaSet.Remove(wsdl);
  1149. SchemaSet.Remove(soap);
  1150. SchemaSet.Remove(soapEncoding);
  1151. SchemaSet.Remove(fakeXsdSchema);
  1152. }
  1153. void MoveSchemas()
  1154. {
  1155. XmlSchemas schemas = this.Schemas;
  1156. XmlSchemaSet schemaSet = this.SchemaSet;
  1157. if (schemas != null)
  1158. {
  1159. schemas.Compile(
  1160. delegate(object sender, ValidationEventArgs args)
  1161. {
  1162. SchemaHelper.HandleSchemaValidationError(sender, args, exporter.Errors);
  1163. },
  1164. false/*fullCompile*/
  1165. );
  1166. foreach (XmlSchema srcSchema in schemas)
  1167. {
  1168. if (!schemaSet.Contains(srcSchema))
  1169. {
  1170. schemaSet.Add(srcSchema);
  1171. schemaSet.Reprocess(srcSchema);
  1172. }
  1173. }
  1174. }
  1175. }
  1176. }
  1177. static class StockSchemas
  1178. {
  1179. internal static XmlSchema CreateWsdl()
  1180. {
  1181. return XmlSchema.Read(new StringReader(wsdl), null);
  1182. }
  1183. internal static XmlSchema CreateSoap()
  1184. {
  1185. return XmlSchema.Read(new StringReader(soap), null);
  1186. }
  1187. internal static XmlSchema CreateSoapEncoding()
  1188. {
  1189. return XmlSchema.Read(new StringReader(soapEncoding), null);
  1190. }
  1191. internal static XmlSchema CreateFakeSoapEncoding()
  1192. {
  1193. return XmlSchema.Read(new StringReader(fakeSoapEncoding), null);
  1194. }
  1195. internal static XmlSchema CreateFakeXsdSchema()
  1196. {
  1197. return XmlSchema.Read(new StringReader(fakeXsd), null);
  1198. }
  1199. internal static XmlSchema CreateFakeXmlSchema()
  1200. {
  1201. return XmlSchema.Read(new StringReader(fakeXmlSchema), null);
  1202. }
  1203. internal static bool IsKnownSchema(string ns)
  1204. {
  1205. return ns == XmlSchema.Namespace || ns == "http://schemas.xmlsoap.org/wsdl/soap/" || ns == "http://schemas.xmlsoap.org/soap/encoding/";
  1206. }
  1207. internal const string WsdlNamespace = "http://schemas.xmlsoap.org/wsdl/";
  1208. internal const string SoapNamespace = "http://schemas.xmlsoap.org/wsdl/soap/";
  1209. internal const string SoapEncodingNamespace = "http://schemas.xmlsoap.org/soap/encoding/";
  1210. const string wsdl = @"<?xml version='1.0' encoding='UTF-8' ?>
  1211. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
  1212. xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
  1213. targetNamespace='http://schemas.xmlsoap.org/wsdl/'
  1214. elementFormDefault='qualified' >
  1215. <xs:complexType mixed='true' name='tDocumentation' >
  1216. <xs:sequence>
  1217. <xs:any minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  1218. </xs:sequence>
  1219. </xs:complexType>
  1220. <xs:complexType name='tDocumented' >
  1221. <xs:annotation>
  1222. <xs:documentation>
  1223. This type is extended by component types to allow them to be documented
  1224. </xs:documentation>
  1225. </xs:annotation>
  1226. <xs:sequence>
  1227. <xs:element name='documentation' type='wsdl:tDocumentation' minOccurs='0' />
  1228. </xs:sequence>
  1229. </xs:complexType>
  1230. <!-- allow extensibility via elements and attributes on all elements swa124 -->
  1231. <xs:complexType name='tExtensibleAttributesDocumented' abstract='true' >
  1232. <xs:complexContent>
  1233. <xs:extension base='wsdl:tDocumented' >
  1234. <xs:annotation>
  1235. <xs:documentation>
  1236. This type is extended by component types to allow attributes from other namespaces to be added.
  1237. </xs:documentation>
  1238. </xs:annotation>
  1239. <xs:sequence>
  1240. <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  1241. </xs:sequence>
  1242. <xs:anyAttribute namespace='##other' processContents='lax' />
  1243. </xs:extension>
  1244. </xs:complexContent>
  1245. </xs:complexType>
  1246. <xs:complexType name='tExtensibleDocumented' abstract='true' >
  1247. <xs:complexContent>
  1248. <xs:extension base='wsdl:tDocumented' >
  1249. <xs:annotation>
  1250. <xs:documentation>
  1251. This type is extended by component types to allow elements from other namespaces to be added.
  1252. </xs:documentation>
  1253. </xs:annotation>
  1254. <xs:sequence>
  1255. <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  1256. </xs:sequence>
  1257. <xs:anyAttribute namespace='##other' processContents='lax' />
  1258. </xs:extension>
  1259. </xs:complexContent>
  1260. </xs:complexType>
  1261. <!-- original wsdl removed as part of swa124 resolution
  1262. <xs:complexType name='tExtensibleAttributesDocumented' abstract='true' >
  1263. <xs:complexContent>
  1264. <xs:extension base='wsdl:tDocumented' >
  1265. <xs:annotation>
  1266. <xs:documentation>
  1267. This type is extended by component types to allow attributes from other namespaces to be added.
  1268. </xs:documentation>
  1269. </xs:annotation>
  1270. <xs:anyAttribute namespace='##other' processContents='lax' />
  1271. </xs:extension>
  1272. </xs:complexContent>
  1273. </xs:complexType>
  1274. <xs:complexType name='tExtensibleDocumented' abstract='true' >
  1275. <xs:complexContent>
  1276. <xs:extension base='wsdl:tDocumented' >
  1277. <xs:annotation>
  1278. <xs:documentation>
  1279. This type is extended by component types to allow elements from other namespaces to be added.
  1280. </xs:documentation>
  1281. </xs:annotation>
  1282. <xs:sequence>
  1283. <xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  1284. </xs:sequence>
  1285. </xs:extension>
  1286. </xs:complexContent>
  1287. </xs:complexType>
  1288. -->
  1289. <xs:element name='definitions' type='wsdl:tDefinitions' >
  1290. <xs:key name='message' >
  1291. <xs:selector xpath='wsdl:message' />
  1292. <xs:field xpath='@name' />
  1293. </xs:key>
  1294. <xs:key name='portType' >
  1295. <xs:selector xpath='wsdl:portType' />
  1296. <xs:field xpath='@name' />
  1297. </xs:key>
  1298. <xs:key name='binding' >
  1299. <xs:selector xpath='wsdl:binding' />
  1300. <xs:field xpath='@name' />
  1301. </xs:key>
  1302. <xs:key name='service' >
  1303. <xs:selector xpath='wsdl:service' />
  1304. <xs:field xpath='@name' />
  1305. </xs:key>
  1306. <xs:key name='import' >
  1307. <xs:selector xpath='wsdl:import' />
  1308. <xs:field xpath='@namespace' />
  1309. </xs:key>
  1310. </xs:element>
  1311. <xs:group name='anyTopLevelOptionalElement' >
  1312. <xs:annotation>
  1313. <xs:documentation>
  1314. 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.
  1315. </xs:documentation>
  1316. </xs:annotation>
  1317. <xs:choice>
  1318. <xs:element name='import' type='wsdl:tImport' />
  1319. <xs:element name='types' type='wsdl:tTypes' />
  1320. <xs:element name='message' type='wsdl:tMessage' >
  1321. <xs:unique name='part' >
  1322. <xs:selector xpath='wsdl:part' />
  1323. <xs:field xpath='@name' />
  1324. </xs:unique>
  1325. </xs:element>
  1326. <xs:element name='portType' type='wsdl:tPortType' />
  1327. <xs:element name='binding' type='wsdl:tBinding' />
  1328. <xs:element name='service' type='wsdl:tService' >
  1329. <xs:unique name='port' >
  1330. <xs:selector xpath='wsdl:port' />
  1331. <xs:field xpath='@name' />
  1332. </xs:unique>
  1333. </xs:element>
  1334. </xs:choice>
  1335. </xs:group>
  1336. <xs:complexType name='tDefinitions' >
  1337. <xs:complexContent>
  1338. <xs:extension base='wsdl:tExtensibleDocumented' >
  1339. <xs:sequence>
  1340. <xs:group ref='wsdl:anyTopLevelOptionalElement' minOccurs='0' maxOccurs='unbounded' />
  1341. </xs:sequence>
  1342. <xs:attribute name='targetNamespace' type='xs:anyURI' use='optional' />
  1343. <xs:attribute name='name' type='xs:NCName' use='optional' />
  1344. </xs:extension>
  1345. </xs:complexContent>
  1346. </xs:complexType>
  1347. <xs:complexType name='tImport' >
  1348. <xs:complexContent>
  1349. <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
  1350. <xs:attribute name='namespace' type='xs:anyURI' use='required' />
  1351. <xs:attribute name='location' type='xs:anyURI' use='required' />
  1352. </xs:extension>
  1353. </xs:complexContent>
  1354. </xs:complexType>
  1355. <xs:complexType name='tTypes' >
  1356. <xs:complexContent>
  1357. <xs:extension base='wsdl:tExtensibleDocumented' />
  1358. </xs:complexContent>
  1359. </xs:complexType>
  1360. <xs:complexType name='tMessage' >
  1361. <xs:complexContent>
  1362. <xs:extension base='wsdl:tExtensibleDocumented' >
  1363. <xs:sequence>
  1364. <xs:element name='part' type='wsdl:tPart' minOccurs='0' maxOccurs='unbounded' />
  1365. </xs:sequence>
  1366. <xs:attribute name='name' type='xs:NCName' use='required' />
  1367. </xs:extension>
  1368. </xs:complexContent>
  1369. </xs:complexType>
  1370. <xs:complexType name='tPart' >
  1371. <xs:complexContent>
  1372. <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
  1373. <xs:attribute name='name' type='xs:NCName' use='required' />
  1374. <xs:attribute name='element' type='xs:QName' use='optional' />
  1375. <xs:attribute name='type' type='xs:QName' use='optional' />
  1376. </xs:extension>
  1377. </xs:complexContent>
  1378. </xs:complexType>
  1379. <xs:complexType name='tPortType' >
  1380. <xs:complexContent>
  1381. <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
  1382. <xs:sequence>
  1383. <xs:element name='operation' type='wsdl:tOperation' minOccurs='0' maxOccurs='unbounded' />
  1384. </xs:sequence>
  1385. <xs:attribute name='name' type='xs:NCName' use='required' />
  1386. </xs:extension>
  1387. </xs:complexContent>
  1388. </xs:complexType>
  1389. <xs:complexType name='tOperation' >
  1390. <xs:complexContent>
  1391. <xs:extension base='wsdl:tExtensibleDocumented' >
  1392. <xs:sequence>
  1393. <xs:choice>
  1394. <xs:group ref='wsdl:request-response-or-one-way-operation' />
  1395. <xs:group ref='wsdl:solicit-response-or-notification-operation' />
  1396. </xs:choice>
  1397. </xs:sequence>
  1398. <xs:attribute name='name' type='xs:NCName' use='required' />
  1399. <xs:attribute name='parameterOrder' type='xs:NMTOKENS' use='optional' />
  1400. </xs:extension>
  1401. </xs:complexContent>
  1402. </xs:complexType>
  1403. <xs:group name='request-response-or-one-way-operation' >
  1404. <xs:sequence>
  1405. <xs:element name='input' type='wsdl:tParam' />
  1406. <xs:sequence minOccurs='0' >
  1407. <xs:element name='output' type='wsdl:tParam' />
  1408. <xs:element name='fault' type='wsdl:tFault' minOccurs='0' maxOccurs='unbounded' />
  1409. </xs:sequence>
  1410. </xs:sequence>
  1411. </xs:group>
  1412. <xs:group name='solicit-response-or-notification-operation' >
  1413. <xs:sequence>
  1414. <xs:element name='output' type='wsdl:tParam' />
  1415. <xs:sequence minOccurs='0' >
  1416. <xs:element name='input' type='wsdl:tParam' />
  1417. <xs:element name='fault' type='wsdl:tFault' minOccurs='0' maxOccurs='unbounded' />
  1418. </xs:sequence>
  1419. </xs:sequence>
  1420. </xs:group>
  1421. <xs:complexType name='tParam' >
  1422. <xs:complexContent>
  1423. <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
  1424. <xs:attribute name='name' type='xs:NCName' use='optional' />
  1425. <xs:attribute name='message' type='xs:QName' use='required' />
  1426. </xs:extension>
  1427. </xs:complexContent>
  1428. </xs:complexType>
  1429. <xs:complexType name='tFault' >
  1430. <xs:complexContent>
  1431. <xs:extension base='wsdl:tExtensibleAttributesDocumented' >
  1432. <xs:attribute name='name' type='xs:NCName' use='required' />
  1433. <xs:attribute name='message' type='xs:QName' use='required' />
  1434. </xs:extension>
  1435. </xs:complexContent>
  1436. </xs:complexType>
  1437. <xs:complexType name='tBinding' >
  1438. <xs:complexContent>
  1439. <xs:extension base='wsdl:tExtensibleDocumented' >
  1440. <xs:sequence>
  1441. <xs:element name='operation' type='wsdl:tBindingOperation' minOccurs='0' maxOccurs='unbounded' />
  1442. </xs:sequence>
  1443. <xs:attribute name='name' type='xs:NCName' use='required' />
  1444. <xs:attribute name='type' type='xs:QName' use='required' />
  1445. </xs:extension>
  1446. </xs:complexContent>
  1447. </xs:complexType>
  1448. <xs:complexType name='tBindingOperationMessage' >
  1449. <xs:complexContent>
  1450. <xs:extension base='wsdl:tExtensibleDocumented' >
  1451. <xs:attribute name='name' type='xs:NCName' use='optional' />
  1452. </xs:extension>
  1453. </xs:complexContent>
  1454. </xs:complexType>
  1455. <xs:complexType name='tBindingOperationFault' >
  1456. <xs:complexContent>
  1457. <xs:extension base='wsdl:tExtensibleDocumented' >
  1458. <xs:attribute name='name' type='xs:NCName' use='required' />
  1459. </xs:extension>
  1460. </xs:complexContent>
  1461. </xs:complexType>
  1462. <xs:complexType name='tBindingOperation' >
  1463. <xs:complexContent>
  1464. <xs:extension base='wsdl:tExtensibleDocumented' >
  1465. <xs:sequence>
  1466. <xs:element name='input' type='wsdl:tBindingOperationMessage' minOccurs='0' />
  1467. <xs:element name='output' type='wsdl:tBindingOperationMessage' minOccurs='0' />
  1468. <xs:element name='fault' type='wsdl:tBindingOperationFault' minOccurs='0' maxOccurs='unbounded' />
  1469. </xs:sequence>
  1470. <xs:attribute name='name' type='xs:NCName' use='required' />
  1471. </xs:extension>
  1472. </xs:complexContent>
  1473. </xs:complexType>
  1474. <xs:complexType name='tService' >
  1475. <xs:complexContent>
  1476. <xs:extension base='wsdl:tExtensibleDocumented' >
  1477. <xs:sequence>
  1478. <xs:element name='port' type='wsdl:tPort' minOccurs='0' maxOccurs='unbounded' />
  1479. </xs:sequence>
  1480. <xs:attribute name='name' type='xs:NCName' use='required' />
  1481. </xs:extension>
  1482. </xs:complexContent>
  1483. </xs:complexType>
  1484. <xs:complexType name='tPort' >
  1485. <xs:complexContent>
  1486. <xs:extension base='wsdl:tExtensibleDocumented' >
  1487. <xs:attribute name='name' type='xs:NCName' use='required' />
  1488. <xs:attribute name='binding' type='xs:QName' use='required' />
  1489. </xs:extension>
  1490. </xs:complexContent>
  1491. </xs:complexType>
  1492. <xs:attribute name='arrayType' type='xs:string' />
  1493. <xs:attribute name='required' type='xs:boolean' />
  1494. <xs:complexType name='tExtensibilityElement' abstract='true' >
  1495. <xs:attribute ref='wsdl:required' use='optional' />
  1496. </xs:complexType>
  1497. </xs:schema>";
  1498. const string soap = @"<?xml version='1.0' encoding='UTF-8' ?>
  1499. <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'>
  1500. <xs:import namespace='http://schemas.xmlsoap.org/wsdl/' />
  1501. <xs:simpleType name='encodingStyle'>
  1502. <xs:annotation>
  1503. <xs:documentation>
  1504. '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
  1505. </xs:documentation>
  1506. </xs:annotation>
  1507. <xs:list itemType='xs:anyURI' />
  1508. </xs:simpleType>
  1509. <xs:element name='binding' type='soap:tBinding' />
  1510. <xs:complexType name='tBinding'>
  1511. <xs:complexContent mixed='false'>
  1512. <xs:extension base='wsdl:tExtensibilityElement'>
  1513. <xs:attribute name='transport' type='xs:anyURI' use='required' />
  1514. <xs:attribute name='style' type='soap:tStyleChoice' use='optional' />
  1515. </xs:extension>
  1516. </xs:complexContent>
  1517. </xs:complexType>
  1518. <xs:simpleType name='tStyleChoice'>
  1519. <xs:restriction base='xs:string'>
  1520. <xs:enumeration value='rpc' />
  1521. <xs:enumeration value='document' />
  1522. </xs:restriction>
  1523. </xs:simpleType>
  1524. <xs:element name='operation' type='soap:tOperation' />
  1525. <xs:complexType name='tOperation'>
  1526. <xs:complexContent mixed='false'>
  1527. <xs:extension base='wsdl:tExtensibilityElement'>
  1528. <xs:attribute name='soapAction' type='xs:anyURI' use='optional' />
  1529. <xs:attribute name='style' type='soap:tStyleChoice' use='optional' />
  1530. </xs:extension>
  1531. </xs:complexContent>
  1532. </xs:complexType>
  1533. <xs:element name='body' type='soap:tBody' />
  1534. <xs:attributeGroup name='tBodyAttributes'>
  1535. <xs:attribute name='encodingStyle' type='soap:encodingStyle' use='optional' />
  1536. <xs:attribute name='use' type='soap:useChoice' use='optional' />
  1537. <xs:attribute name='namespace' type='xs:anyURI' use='optional' />
  1538. </xs:attributeGroup>
  1539. <xs:complexType name='tBody'>
  1540. <xs:complexContent mixed='false'>
  1541. <xs:extension base='wsdl:tExtensibilityElement'>
  1542. <xs:attribute name='parts' type='xs:NMTOKENS' use='optional' />
  1543. <xs:attributeGroup ref='soap:tBodyAttributes' />
  1544. </xs:extension>
  1545. </xs:complexContent>
  1546. </xs:complexType>
  1547. <xs:simpleType name='useChoice'>
  1548. <xs:restriction base='xs:string'>
  1549. <xs:enumeration value='literal' />
  1550. <xs:enumeration value='encoded' />
  1551. </xs:restriction>
  1552. </xs:simpleType>
  1553. <xs:element name='fault' type='soap:tFault' />
  1554. <xs:complexType name='tFaultRes' abstract='true'>
  1555. <xs:complexContent mixed='false'>
  1556. <xs:restriction base='soap:tBody'>
  1557. <xs:attribute ref='wsdl:required' use='optional' />
  1558. <xs:attribute name='parts' type='xs:NMTOKENS' use='prohibited' />
  1559. <xs:attributeGroup ref='soap:tBodyAttributes' />
  1560. </xs:restriction>
  1561. </xs:complexContent>
  1562. </xs:complexType>
  1563. <xs:complexType name='tFault'>
  1564. <xs:complexContent mixed='false'>
  1565. <xs:extension base='soap:tFaultRes'>
  1566. <xs:attribute name='name' type='xs:NCName' use='required' />
  1567. </xs:extension>
  1568. </xs:complexContent>
  1569. </xs:complexType>
  1570. <xs:element name='header' type='soap:tHeader' />
  1571. <xs:attributeGroup name='tHeaderAttributes'>
  1572. <xs:attribute name='message' type='xs:QName' use='required' />
  1573. <xs:attribute name='part' type='xs:NMTOKEN' use='required' />
  1574. <xs:attribute name='use' type='soap:useChoice' use='required' />
  1575. <xs:attribute name='encodingStyle' type='soap:encodingStyle' use='optional' />
  1576. <xs:attribute name='namespace' type='xs:anyURI' use='optional' />
  1577. </xs:attributeGroup>
  1578. <xs:complexType name='tHeader'>
  1579. <xs:complexContent mixed='false'>
  1580. <xs:extension base='wsdl:tExtensibilityElement'>
  1581. <xs:sequence>
  1582. <xs:element minOccurs='0' maxOccurs='unbounded' ref='soap:headerfault' />
  1583. </xs:sequence>
  1584. <xs:attributeGroup ref='soap:tHeaderAttributes' />
  1585. </xs:extension>
  1586. </xs:complexContent>
  1587. </xs:complexType>
  1588. <xs:element name='headerfault' type='soap:tHeaderFault' />
  1589. <xs:complexType name='tHeaderFault'>
  1590. <xs:attributeGroup ref='soap:tHeaderAttributes' />
  1591. </xs:complexType>
  1592. <xs:element name='address' type='soap:tAddress' />
  1593. <xs:complexType name='tAddress'>
  1594. <xs:complexContent mixed='false'>
  1595. <xs:extension base='wsdl:tExtensibilityElement'>
  1596. <xs:attribute name='location' type='xs:anyURI' use='required' />
  1597. </xs:extension>
  1598. </xs:complexContent>
  1599. </xs:complexType>
  1600. </xs:schema>";
  1601. const string soapEncoding = @"<?xml version='1.0' encoding='UTF-8' ?>
  1602. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
  1603. xmlns:tns='http://schemas.xmlsoap.org/soap/encoding/'
  1604. targetNamespace='http://schemas.xmlsoap.org/soap/encoding/' >
  1605. <xs:attribute name='root' >
  1606. <xs:simpleType>
  1607. <xs:restriction base='xs:boolean'>
  1608. <xs:pattern value='0|1' />
  1609. </xs:restriction>
  1610. </xs:simpleType>
  1611. </xs:attribute>
  1612. <xs:attributeGroup name='commonAttributes' >
  1613. <xs:attribute name='id' type='xs:ID' />
  1614. <xs:attribute name='href' type='xs:anyURI' />
  1615. <xs:anyAttribute namespace='##other' processContents='lax' />
  1616. </xs:attributeGroup>
  1617. <xs:simpleType name='arrayCoordinate' >
  1618. <xs:restriction base='xs:string' />
  1619. </xs:simpleType>
  1620. <xs:attribute name='arrayType' type='xs:string' />
  1621. <xs:attribute name='offset' type='tns:arrayCoordinate' />
  1622. <xs:attributeGroup name='arrayAttributes' >
  1623. <xs:attribute ref='tns:arrayType' />
  1624. <xs:attribute ref='tns:offset' />
  1625. </xs:attributeGroup>
  1626. <xs:attribute name='position' type='tns:arrayCoordinate' />
  1627. <xs:attributeGroup name='arrayMemberAttributes' >
  1628. <xs:attribute ref='tns:position' />
  1629. </xs:attributeGroup>
  1630. <xs:group name='Array' >
  1631. <xs:sequence>
  1632. <xs:any namespace='##any' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  1633. </xs:sequence>
  1634. </xs:group>
  1635. <xs:element name='Array' type='tns:Array' />
  1636. <xs:complexType name='Array' >
  1637. <xs:group ref='tns:Array' minOccurs='0' />
  1638. <xs:attributeGroup ref='tns:arrayAttributes' />
  1639. <xs:attributeGroup ref='tns:commonAttributes' />
  1640. </xs:complexType>
  1641. <xs:element name='Struct' type='tns:Struct' />
  1642. <xs:group name='Struct' >
  1643. <xs:sequence>
  1644. <xs:any namespace='##any' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  1645. </xs:sequence>
  1646. </xs:group>
  1647. <xs:complexType name='Struct' >
  1648. <xs:group ref='tns:Struct' minOccurs='0' />
  1649. <xs:attributeGroup ref='tns:commonAttributes'/>
  1650. </xs:complexType>
  1651. <xs:simpleType name='base64' >
  1652. <xs:restriction base='xs:base64Binary' />
  1653. </xs:simpleType>
  1654. <xs:element name='duration' type='tns:duration' />
  1655. <xs:complexType name='duration' >
  1656. <xs:simpleContent>
  1657. <xs:extension base='xs:duration' >
  1658. <xs:attributeGroup ref='tns:commonAttributes' />
  1659. </xs:extension>
  1660. </xs:simpleContent>
  1661. </xs:complexType>
  1662. <xs:element name='dateTime' type='tns:dateTime' />
  1663. <xs:complexType name='dateTime' >
  1664. <xs:simpleContent>
  1665. <xs:extension base='xs:dateTime' >
  1666. <xs:attributeGroup ref='tns:commonAttributes' />
  1667. </xs:extension>
  1668. </xs:simpleContent>
  1669. </xs:complexType>
  1670. <xs:element name='NOTATION' type='tns:NOTATION' />
  1671. <xs:complexType name='NOTATION' >
  1672. <xs:simpleContent>
  1673. <xs:extension base='xs:QName' >
  1674. <xs:attributeGroup ref='tns:commonAttributes' />
  1675. </xs:extension>
  1676. </xs:simpleContent>
  1677. </xs:complexType>
  1678. <xs:element name='time' type='tns:time' />
  1679. <xs:complexType name='time' >
  1680. <xs:simpleContent>
  1681. <xs:extension base='xs:time' >
  1682. <xs:attributeGroup ref='tns:commonAttributes' />
  1683. </xs:extension>
  1684. </xs:simpleContent>
  1685. </xs:complexType>
  1686. <xs:element name='date' type='tns:date' />
  1687. <xs:complexType name='date' >
  1688. <xs:simpleContent>
  1689. <xs:extension base='xs:date' >
  1690. <xs:attributeGroup ref='tns:commonAttributes' />
  1691. </xs:extension>
  1692. </xs:simpleContent>
  1693. </xs:complexType>
  1694. <xs:element name='gYearMonth' type='tns:gYearMonth' />
  1695. <xs:complexType name='gYearMonth' >
  1696. <xs:simpleContent>
  1697. <xs:extension base='xs:gYearMonth' >
  1698. <xs:attributeGroup ref='tns:commonAttributes' />
  1699. </xs:extension>
  1700. </xs:simpleContent>
  1701. </xs:complexType>
  1702. <xs:element name='gYear' type='tns:gYear' />
  1703. <xs:complexType name='gYear' >
  1704. <xs:simpleContent>
  1705. <xs:extension base='xs:gYear' >
  1706. <xs:attributeGroup ref='tns:commonAttributes' />
  1707. </xs:extension>
  1708. </xs:simpleContent>
  1709. </xs:complexType>
  1710. <xs:element name='gMonthDay' type='tns:gMonthDay' />
  1711. <xs:complexType name='gMonthDay' >
  1712. <xs:simpleContent>
  1713. <xs:extension base='xs:gMonthDay' >
  1714. <xs:attributeGroup ref='tns:commonAttributes' />
  1715. </xs:extension>
  1716. </xs:simpleContent>
  1717. </xs:complexType>
  1718. <xs:element name='gDay' type='tns:gDay' />
  1719. <xs:complexType name='gDay' >
  1720. <xs:simpleContent>
  1721. <xs:extension base='xs:gDay' >
  1722. <xs:attributeGroup ref='tns:commonAttributes' />
  1723. </xs:extension>
  1724. </xs:simpleContent>
  1725. </xs:complexType>
  1726. <xs:element name='gMonth' type='tns:gMonth' />
  1727. <xs:complexType name='gMonth' >
  1728. <xs:simpleContent>
  1729. <xs:extension base='xs:gMonth' >
  1730. <xs:attributeGroup ref='tns:commonAttributes' />
  1731. </xs:extension>
  1732. </xs:simpleContent>
  1733. </xs:complexType>
  1734. <xs:element name='boolean' type='tns:boolean' />
  1735. <xs:complexType name='boolean' >
  1736. <xs:simpleContent>
  1737. <xs:extension base='xs:boolean' >
  1738. <xs:attributeGroup ref='tns:commonAttributes' />
  1739. </xs:extension>
  1740. </xs:simpleContent>
  1741. </xs:complexType>
  1742. <xs:element name='base64Binary' type='tns:base64Binary' />
  1743. <xs:complexType name='base64Binary' >
  1744. <xs:simpleContent>
  1745. <xs:extension base='xs:base64Binary' >
  1746. <xs:attributeGroup ref='tns:commonAttributes' />
  1747. </xs:extension>
  1748. </xs:simpleContent>
  1749. </xs:complexType>
  1750. <xs:element name='hexBinary' type='tns:hexBinary' />
  1751. <xs:complexType name='hexBinary' >
  1752. <xs:simpleContent>
  1753. <xs:extension base='xs:hexBinary' >
  1754. <xs:attributeGroup ref='tns:commonAttributes' />
  1755. </xs:extension>
  1756. </xs:simpleContent>
  1757. </xs:complexType>
  1758. <xs:element name='float' type='tns:float' />
  1759. <xs:complexType name='float' >
  1760. <xs:simpleContent>
  1761. <xs:extension base='xs:float' >
  1762. <xs:attributeGroup ref='tns:commonAttributes' />
  1763. </xs:extension>
  1764. </xs:simpleContent>
  1765. </xs:complexType>
  1766. <xs:element name='double' type='tns:double' />
  1767. <xs:complexType name='double' >
  1768. <xs:simpleContent>
  1769. <xs:extension base='xs:double' >
  1770. <xs:attributeGroup ref='tns:commonAttributes' />
  1771. </xs:extension>
  1772. </xs:simpleContent>
  1773. </xs:complexType>
  1774. <xs:element name='anyURI' type='tns:anyURI' />
  1775. <xs:complexType name='anyURI' >
  1776. <xs:simpleContent>
  1777. <xs:extension base='xs:anyURI' >
  1778. <xs:attributeGroup ref='tns:commonAttributes' />
  1779. </xs:extension>
  1780. </xs:simpleContent>
  1781. </xs:complexType>
  1782. <xs:element name='QName' type='tns:QName' />
  1783. <xs:complexType name='QName' >
  1784. <xs:simpleContent>
  1785. <xs:extension base='xs:QName' >
  1786. <xs:attributeGroup ref='tns:commonAttributes' />
  1787. </xs:extension>
  1788. </xs:simpleContent>
  1789. </xs:complexType>
  1790. <xs:element name='string' type='tns:string' />
  1791. <xs:complexType name='string' >
  1792. <xs:simpleContent>
  1793. <xs:extension base='xs:string' >
  1794. <xs:attributeGroup ref='tns:commonAttributes' />
  1795. </xs:extension>
  1796. </xs:simpleContent>
  1797. </xs:complexType>
  1798. <xs:element name='normalizedString' type='tns:normalizedString' />
  1799. <xs:complexType name='normalizedString' >
  1800. <xs:simpleContent>
  1801. <xs:extension base='xs:normalizedString' >
  1802. <xs:attributeGroup ref='tns:commonAttributes' />
  1803. </xs:extension>
  1804. </xs:simpleContent>
  1805. </xs:complexType>
  1806. <xs:element name='token' type='tns:token' />
  1807. <xs:complexType name='token' >
  1808. <xs:simpleContent>
  1809. <xs:extension base='xs:token' >
  1810. <xs:attributeGroup ref='tns:commonAttributes' />
  1811. </xs:extension>
  1812. </xs:simpleContent>
  1813. </xs:complexType>
  1814. <xs:element name='language' type='tns:language' />
  1815. <xs:complexType name='language' >
  1816. <xs:simpleContent>
  1817. <xs:extension base='xs:language' >
  1818. <xs:attributeGroup ref='tns:commonAttributes' />
  1819. </xs:extension>
  1820. </xs:simpleContent>
  1821. </xs:complexType>
  1822. <xs:element name='Name' type='tns:Name' />
  1823. <xs:complexType name='Name' >
  1824. <xs:simpleContent>
  1825. <xs:extension base='xs:Name' >
  1826. <xs:attributeGroup ref='tns:commonAttributes' />
  1827. </xs:extension>
  1828. </xs:simpleContent>
  1829. </xs:complexType>
  1830. <xs:element name='NMTOKEN' type='tns:NMTOKEN' />
  1831. <xs:complexType name='NMTOKEN' >
  1832. <xs:simpleContent>
  1833. <xs:extension base='xs:NMTOKEN' >
  1834. <xs:attributeGroup ref='tns:commonAttributes' />
  1835. </xs:extension>
  1836. </xs:simpleContent>
  1837. </xs:complexType>
  1838. <xs:element name='NCName' type='tns:NCName' />
  1839. <xs:complexType name='NCName' >
  1840. <xs:simpleContent>
  1841. <xs:extension base='xs:NCName' >
  1842. <xs:attributeGroup ref='tns:commonAttributes' />
  1843. </xs:extension>
  1844. </xs:simpleContent>
  1845. </xs:complexType>
  1846. <xs:element name='NMTOKENS' type='tns:NMTOKENS' />
  1847. <xs:complexType name='NMTOKENS' >
  1848. <xs:simpleContent>
  1849. <xs:extension base='xs:NMTOKENS' >
  1850. <xs:attributeGroup ref='tns:commonAttributes' />
  1851. </xs:extension>
  1852. </xs:simpleContent>
  1853. </xs:complexType>
  1854. <xs:element name='ID' type='tns:ID' />
  1855. <xs:complexType name='ID' >
  1856. <xs:simpleContent>
  1857. <xs:extension base='xs:ID' >
  1858. <xs:attributeGroup ref='tns:commonAttributes' />
  1859. </xs:extension>
  1860. </xs:simpleContent>
  1861. </xs:complexType>
  1862. <xs:element name='IDREF' type='tns:IDREF' />
  1863. <xs:complexType name='IDREF' >
  1864. <xs:simpleContent>
  1865. <xs:extension base='xs:IDREF' >
  1866. <xs:attributeGroup ref='tns:commonAttributes' />
  1867. </xs:extension>
  1868. </xs:simpleContent>
  1869. </xs:complexType>
  1870. <xs:element name='ENTITY' type='tns:ENTITY' />
  1871. <xs:complexType name='ENTITY' >
  1872. <xs:simpleContent>
  1873. <xs:extension base='xs:ENTITY' >
  1874. <xs:attributeGroup ref='tns:commonAttributes' />
  1875. </xs:extension>
  1876. </xs:simpleContent>
  1877. </xs:complexType>
  1878. <xs:element name='IDREFS' type='tns:IDREFS' />
  1879. <xs:complexType name='IDREFS' >
  1880. <xs:simpleContent>
  1881. <xs:extension base='xs:IDREFS' >
  1882. <xs:attributeGroup ref='tns:commonAttributes' />
  1883. </xs:extension>
  1884. </xs:simpleContent>
  1885. </xs:complexType>
  1886. <xs:element name='ENTITIES' type='tns:ENTITIES' />
  1887. <xs:complexType name='ENTITIES' >
  1888. <xs:simpleContent>
  1889. <xs:extension base='xs:ENTITIES' >
  1890. <xs:attributeGroup ref='tns:commonAttributes' />
  1891. </xs:extension>
  1892. </xs:simpleContent>
  1893. </xs:complexType>
  1894. <xs:element name='decimal' type='tns:decimal' />
  1895. <xs:complexType name='decimal' >
  1896. <xs:simpleContent>
  1897. <xs:extension base='xs:decimal' >
  1898. <xs:attributeGroup ref='tns:commonAttributes' />
  1899. </xs:extension>
  1900. </xs:simpleContent>
  1901. </xs:complexType>
  1902. <xs:element name='integer' type='tns:integer' />
  1903. <xs:complexType name='integer' >
  1904. <xs:simpleContent>
  1905. <xs:extension base='xs:integer' >
  1906. <xs:attributeGroup ref='tns:commonAttributes' />
  1907. </xs:extension>
  1908. </xs:simpleContent>
  1909. </xs:complexType>
  1910. <xs:element name='nonPositiveInteger' type='tns:nonPositiveInteger' />
  1911. <xs:complexType name='nonPositiveInteger' >
  1912. <xs:simpleContent>
  1913. <xs:extension base='xs:nonPositiveInteger' >
  1914. <xs:attributeGroup ref='tns:commonAttributes' />
  1915. </xs:extension>
  1916. </xs:simpleContent>
  1917. </xs:complexType>
  1918. <xs:element name='negativeInteger' type='tns:negativeInteger' />
  1919. <xs:complexType name='negativeInteger' >
  1920. <xs:simpleContent>
  1921. <xs:extension base='xs:negativeInteger' >
  1922. <xs:attributeGroup ref='tns:commonAttributes' />
  1923. </xs:extension>
  1924. </xs:simpleContent>
  1925. </xs:complexType>
  1926. <xs:element name='long' type='tns:long' />
  1927. <xs:complexType name='long' >
  1928. <xs:simpleContent>
  1929. <xs:extension base='xs:long' >
  1930. <xs:attributeGroup ref='tns:commonAttributes' />
  1931. </xs:extension>
  1932. </xs:simpleContent>
  1933. </xs:complexType>
  1934. <xs:element name='int' type='tns:int' />
  1935. <xs:complexType name='int' >
  1936. <xs:simpleContent>
  1937. <xs:extension base='xs:int' >
  1938. <xs:attributeGroup ref='tns:commonAttributes' />
  1939. </xs:extension>
  1940. </xs:simpleContent>
  1941. </xs:complexType>
  1942. <xs:element name='short' type='tns:short' />
  1943. <xs:complexType name='short' >
  1944. <xs:simpleContent>
  1945. <xs:extension base='xs:short' >
  1946. <xs:attributeGroup ref='tns:commonAttributes' />
  1947. </xs:extension>
  1948. </xs:simpleContent>
  1949. </xs:complexType>
  1950. <xs:element name='byte' type='tns:byte' />
  1951. <xs:complexType name='byte' >
  1952. <xs:simpleContent>
  1953. <xs:extension base='xs:byte' >
  1954. <xs:attributeGroup ref='tns:commonAttributes' />
  1955. </xs:extension>
  1956. </xs:simpleContent>
  1957. </xs:complexType>
  1958. <xs:element name='nonNegativeInteger' type='tns:nonNegativeInteger' />
  1959. <xs:complexType name='nonNegativeInteger' >
  1960. <xs:simpleContent>
  1961. <xs:extension base='xs:nonNegativeInteger' >
  1962. <xs:attributeGroup ref='tns:commonAttributes' />
  1963. </xs:extension>
  1964. </xs:simpleContent>
  1965. </xs:complexType>
  1966. <xs:element name='unsignedLong' type='tns:unsignedLong' />
  1967. <xs:complexType name='unsignedLong' >
  1968. <xs:simpleContent>
  1969. <xs:extension base='xs:unsignedLong' >
  1970. <xs:attributeGroup ref='tns:commonAttributes' />
  1971. </xs:extension>
  1972. </xs:simpleContent>
  1973. </xs:complexType>
  1974. <xs:element name='unsignedInt' type='tns:unsignedInt' />
  1975. <xs:complexType name='unsignedInt' >
  1976. <xs:simpleContent>
  1977. <xs:extension base='xs:unsignedInt' >
  1978. <xs:attributeGroup ref='tns:commonAttributes' />
  1979. </xs:extension>
  1980. </xs:simpleContent>
  1981. </xs:complexType>
  1982. <xs:element name='unsignedShort' type='tns:unsignedShort' />
  1983. <xs:complexType name='unsignedShort' >
  1984. <xs:simpleContent>
  1985. <xs:extension base='xs:unsignedShort' >
  1986. <xs:attributeGroup ref='tns:commonAttributes' />
  1987. </xs:extension>
  1988. </xs:simpleContent>
  1989. </xs:complexType>
  1990. <xs:element name='unsignedByte' type='tns:unsignedByte' />
  1991. <xs:complexType name='unsignedByte' >
  1992. <xs:simpleContent>
  1993. <xs:extension base='xs:unsignedByte' >
  1994. <xs:attributeGroup ref='tns:commonAttributes' />
  1995. </xs:extension>
  1996. </xs:simpleContent>
  1997. </xs:complexType>
  1998. <xs:element name='positiveInteger' type='tns:positiveInteger' />
  1999. <xs:complexType name='positiveInteger' >
  2000. <xs:simpleContent>
  2001. <xs:extension base='xs:positiveInteger' >
  2002. <xs:attributeGroup ref='tns:commonAttributes' />
  2003. </xs:extension>
  2004. </xs:simpleContent>
  2005. </xs:complexType>
  2006. <xs:element name='anyType' />
  2007. </xs:schema>";
  2008. const string fakeXsd = @"<?xml version='1.0' encoding='UTF-8' ?>
  2009. <xsd:schema targetNamespace=""http://www.w3.org/2001/XMLSchema"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  2010. <xsd:element name=""schema"">
  2011. <xsd:complexType />
  2012. </xsd:element>
  2013. </xsd:schema>";
  2014. const string fakeXmlSchema = @"<xs:schema targetNamespace='http://www.w3.org/XML/1998/namespace' xmlns:xs='http://www.w3.org/2001/XMLSchema' xml:lang='en'>
  2015. <xs:attribute name='lang' type='xs:language'/>
  2016. <xs:attribute name='space'>
  2017. <xs:simpleType>
  2018. <xs:restriction base='xs:NCName'>
  2019. <xs:enumeration value='default'/>
  2020. <xs:enumeration value='preserve'/>
  2021. </xs:restriction>
  2022. </xs:simpleType>
  2023. </xs:attribute>
  2024. <xs:attribute name='base' type='xs:anyURI'/>
  2025. <xs:attribute name='id' type='xs:ID' />
  2026. <xs:attributeGroup name='specialAttrs'>
  2027. <xs:attribute ref='xml:base'/>
  2028. <xs:attribute ref='xml:lang'/>
  2029. <xs:attribute ref='xml:space'/>
  2030. </xs:attributeGroup>
  2031. </xs:schema>";
  2032. const string fakeSoapEncoding = @"<?xml version='1.0' encoding='UTF-8' ?>
  2033. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
  2034. xmlns:tns='http://schemas.xmlsoap.org/soap/encoding/'
  2035. targetNamespace='http://schemas.xmlsoap.org/soap/encoding/' >
  2036. <xs:attributeGroup name='commonAttributes' >
  2037. <xs:attribute name='id' type='xs:ID' />
  2038. <xs:attribute name='href' type='xs:anyURI' />
  2039. <xs:anyAttribute namespace='##other' processContents='lax' />
  2040. </xs:attributeGroup>
  2041. <xs:simpleType name='arrayCoordinate' >
  2042. <xs:restriction base='xs:string' />
  2043. </xs:simpleType>
  2044. <xs:attribute name='arrayType' type='xs:string' />
  2045. <xs:attribute name='offset' type='tns:arrayCoordinate' />
  2046. <xs:attributeGroup name='arrayAttributes' >
  2047. <xs:attribute ref='tns:arrayType' />
  2048. <xs:attribute ref='tns:offset' />
  2049. </xs:attributeGroup>
  2050. <xs:group name='Array' >
  2051. <xs:sequence>
  2052. <xs:any namespace='##any' minOccurs='0' maxOccurs='unbounded' processContents='lax' />
  2053. </xs:sequence>
  2054. </xs:group>
  2055. <xs:element name='Array' type='tns:Array' />
  2056. <xs:complexType name='Array' >
  2057. <xs:group ref='tns:Array' minOccurs='0' />
  2058. <xs:attributeGroup ref='tns:arrayAttributes' />
  2059. <xs:attributeGroup ref='tns:commonAttributes' />
  2060. </xs:complexType>
  2061. </xs:schema>";
  2062. }
  2063. }