2 // System.Web.Services.Description.BasicProfileChecker.cs
5 // Lluis Sanchez (lluis@novell.com)
6 // Atsushi Enomoto (atsushi@ximian.com)
8 // Copyright (C) Novell, Inc., 2004
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Xml.Schema;
35 using System.Xml.Serialization;
37 using System.Collections;
39 namespace System.Web.Services.Description
41 internal class BasicProfileChecker: ConformanceChecker
43 public static BasicProfileChecker Instance = new BasicProfileChecker ();
45 public override WsiProfiles Claims {
46 get { return WsiProfiles.BasicProfile1_1; }
50 private string GetAbsoluteUri (string baseUri, string relativeUri)
52 string actualBaseUri = baseUri ?? Path.GetFullPath (".") + Path.DirectorySeparatorChar;
53 Uri uri = new Uri (new Uri (actualBaseUri), relativeUri);
54 return uri.ToString ();
58 public override void Check (ConformanceCheckContext ctx, Import value)
60 if (value.Location == "" || value.Location == null) {
61 ctx.ReportRuleViolation (value, BasicProfileRules.R2007);
65 if (!new Uri (value.Namespace, UriKind.RelativeOrAbsolute).IsAbsoluteUri)
66 ctx.ReportRuleViolation (value, BasicProfileRules.R2803);
68 // LAMESPEC: RetrievalUrl does not seem to help here (in .NET)
69 //ServiceDescription importer = value.ServiceDescription;
70 //string absUri = GetAbsoluteUri (importer != null ? importer.RetrievalUrl : null, value.Location);
71 object doc = ctx.GetDocument (/*absUri*/value.Location, value.Namespace);
72 if (doc == null) // and looks like .net ignores non-resolvable documentation... I dunno if it makes sense. I don't care :/
73 return; //ctx.ReportError (value, "Document '" + value.Location + "' not found");
76 ctx.ReportRuleViolation (value, BasicProfileRules.R2002);
78 ServiceDescription imported = doc as ServiceDescription;
79 if (imported == null) {
80 ctx.ReportRuleViolation (value, BasicProfileRules.R2001);
84 if (imported.TargetNamespace != value.Namespace)
85 ctx.ReportRuleViolation (value, BasicProfileRules.R2005);
88 public override void Check (ConformanceCheckContext ctx, ServiceDescription value)
90 // R4005 (and R1034, which turned out to be redundant)
91 if (value.Namespaces != null)
92 foreach (XmlQualifiedName qname in value.Namespaces.ToArray ())
93 if (qname.Namespace == "http://www.w3.org/XML/1998/namespace")
94 ctx.ReportRuleViolation (value, BasicProfileRules.R4005);
96 CheckDuplicateSoapAddressBinding (ctx, value);
99 void CheckDuplicateSoapAddressBinding (ConformanceCheckContext ctx, ServiceDescription value)
101 ArrayList locations = new ArrayList ();
102 foreach (PortType p in value.PortTypes) {
103 SoapAddressBinding b = (SoapAddressBinding) p.Extensions.Find (typeof (SoapAddressBinding));
104 if (b == null || b.Location == null || b.Location.Length == 0)
106 if (locations.Contains (b.Location)) {
107 ctx.ReportRuleViolation (value, BasicProfileRules.R2711);
108 // One report for one ServiceDescription should be enough.
111 locations.Add (b.Location);
115 public override void Check (ConformanceCheckContext ctx, ServiceDescriptionFormatExtension value)
118 ctx.ReportRuleViolation (value, BasicProfileRules.R2026);
121 public override void Check (ConformanceCheckContext ctx, MessagePart value)
123 CheckWsdlQName (ctx, value, value.Type);
124 CheckWsdlQName (ctx, value, value.Element);
126 if (value.DefinedByElement && value.Element.Namespace == XmlSchema.Namespace)
127 ctx.ReportRuleViolation (value, BasicProfileRules.R2206);
129 if (value.Type != null && value.Type != XmlQualifiedName.Empty &&
130 value.Element != null && value.Element != XmlQualifiedName.Empty)
131 ctx.ReportRuleViolation (value, BasicProfileRules.R2306);
134 public override void Check (ConformanceCheckContext ctx, Types value)
138 public override void Check (ConformanceCheckContext ctx, Message value)
142 public override void Check (ConformanceCheckContext ctx, BindingCollection value) {
143 foreach (Binding b in value)
144 foreach (object ext in b.Extensions)
145 if (ext.GetType () == typeof (SoapBinding))
148 ctx.ReportRuleViolation (value, BasicProfileRules.R2401);
151 public override void Check (ConformanceCheckContext ctx, Binding value)
153 SoapBinding sb = (SoapBinding) value.Extensions.Find (typeof(SoapBinding));
157 if (sb.Transport == null || sb.Transport == "") {
158 ctx.ReportRuleViolation (value, BasicProfileRules.R2701);
162 if (sb.Transport != "http://schemas.xmlsoap.org/soap/http")
163 ctx.ReportRuleViolation (value, BasicProfileRules.R2702);
165 LiteralType type = GetLiteralBindingType (value);
166 if (type == LiteralType.NotLiteral)
167 ctx.ReportRuleViolation (value, BasicProfileRules.R2706);
168 else if (type == LiteralType.Inconsistent)
169 ctx.ReportRuleViolation (value, BasicProfileRules.R2705);
171 // Collect all parts referenced from this type
173 Hashtable parts = new Hashtable ();
174 PortType port = ctx.Services.GetPortType (value.Type);
175 foreach (Operation op in port.Operations) {
176 foreach (OperationMessage om in op.Messages) {
177 Message msg = ctx.Services.GetMessage (om.Message);
178 foreach (MessagePart part in msg.Parts)
179 parts [part] = part; // do not use Add() - there could be the same MessagePart instance.
183 foreach (OperationBinding ob in value.Operations) {
184 if (ob.Input != null) CheckMessageBinding (ctx, parts, ob.Input);
185 if (ob.Output != null) CheckMessageBinding (ctx, parts, ob.Output);
186 foreach (FaultBinding fb in ob.Faults)
187 CheckMessageBinding (ctx, parts, fb);
191 ctx.ReportRuleViolation (value, BasicProfileRules.R2209);
193 // check existence of corresponding operation in portType for each binding operation
194 if (CheckCorrespondingOperationsForBinding (ctx, value, port))
195 ctx.ReportRuleViolation (value, BasicProfileRules.R2718);
197 // check duplicate operation signature.
198 ArrayList sigs = new ArrayList ();
199 foreach (OperationBinding ob in value.Operations) {
200 if (sigs.Contains (ob.Name))
201 ctx.ReportRuleViolation (value, BasicProfileRules.R2710);
205 // check namespace declarations.
207 case LiteralType.Document:
208 case LiteralType.Rpc:
209 CheckSoapBindingExtensions (ctx, value, type);
214 bool CheckCorrespondingOperationsForBinding (ConformanceCheckContext ctx, Binding value, PortType port)
216 if (value.Operations.Count != port.Operations.Count)
218 foreach (OperationBinding b in value.Operations) {
219 Operation op = port.Operations.Find (b.Name);
225 msg = op.Messages.Input != null;
226 bind = b.Input != null;
230 msg = op.Messages.Output != null;
231 bind = b.Output != null;
235 foreach (FaultBinding fb in b.Faults)
236 if (op.Messages.Find (fb.Name) == null)
242 void CheckSoapBindingExtensions (ConformanceCheckContext ctx, Binding value, LiteralType type)
244 bool violationNS = false;
245 bool violation2717 = false;
246 bool violation2720 = false;
247 bool violation2721 = false;
249 foreach (OperationBinding op in value.Operations) {
250 SoapBodyBinding sbb = op.Extensions.Find (typeof (SoapBodyBinding)) as SoapBodyBinding;
252 if (type == LiteralType.Document && sbb.Namespace != null)
254 if (type == LiteralType.Rpc && sbb.Namespace == null)
255 violation2717 = true;
258 SoapHeaderBinding shb = op.Extensions.Find (typeof (SoapHeaderBinding)) as SoapHeaderBinding;
260 violationNS |= shb.Namespace != null;
261 violation2720 |= !IsValidPart (shb.Part);
264 SoapHeaderFaultBinding sfhb = op.Extensions.Find (typeof (SoapHeaderFaultBinding)) as SoapHeaderFaultBinding;
266 violationNS |= sfhb.Namespace != null;
267 violation2720 |= !IsValidPart (sfhb.Part);
270 SoapFaultBinding sfb = op.Extensions.Find (typeof (SoapFaultBinding)) as SoapFaultBinding;
272 violation2721 |= sfb.Name == null;
273 violationNS |= sfb.Namespace != null;
277 ctx.ReportRuleViolation (value,
278 type == LiteralType.Document ?
279 BasicProfileRules.R2716 :
280 BasicProfileRules.R2726);
282 ctx.ReportRuleViolation (value, BasicProfileRules.R2717);
284 ctx.ReportRuleViolation (value, BasicProfileRules.R2720);
286 ctx.ReportRuleViolation (value, BasicProfileRules.R2721);
289 bool IsValidPart (string part)
294 XmlConvert.VerifyNMTOKEN (part);
296 } catch (XmlException) {
301 public override void Check (ConformanceCheckContext ctx, OperationBinding value)
305 foreach (FaultBinding fb in value.Faults) {
306 SoapFaultBinding sfb = (SoapFaultBinding) value.Extensions.Find (typeof (SoapFaultBinding));
309 r2754 |= sfb.Name != fb.Name;
310 r2723 |= sfb.Use == SoapBindingUse.Encoded;
313 ctx.ReportRuleViolation (value, BasicProfileRules.R2754);
315 ctx.ReportRuleViolation (value, BasicProfileRules.R2723);
318 void CheckMessageBinding (ConformanceCheckContext ctx, Hashtable portParts, MessageBinding value)
320 SoapBodyBinding sbb = (SoapBodyBinding) value.Extensions.Find (typeof(SoapBodyBinding));
321 Message msg = FindMessage (ctx, value);
322 LiteralType bt = GetLiteralBindingType (value.OperationBinding.Binding);
326 if (bt == LiteralType.Document)
328 if (sbb.Parts != null && sbb.Parts.Length > 1)
329 ctx.ReportRuleViolation (value, BasicProfileRules.R2201);
331 if (sbb.Parts == null) {
332 if (msg.Parts != null && msg.Parts.Count > 1)
333 ctx.ReportRuleViolation (value, BasicProfileRules.R2210);
334 if (msg.Parts.Count == 1)
335 portParts.Remove (msg.Parts[0]);
338 if (sbb.Parts.Length == 0 && msg.Parts.Count == 1) {
339 portParts.Remove (msg.Parts[0]);
341 foreach (string part in sbb.Parts) {
342 MessagePart mp = msg.FindPartByName (part);
343 portParts.Remove (mp);
344 if (!mp.DefinedByElement)
345 ctx.ReportRuleViolation (value, BasicProfileRules.R2204);
350 else if (bt == LiteralType.Rpc)
352 if (sbb.Parts != null) {
353 foreach (string part in sbb.Parts) {
354 MessagePart mp = msg.FindPartByName (part);
355 portParts.Remove (mp);
356 if (!mp.DefinedByType)
357 ctx.ReportRuleViolation (value, BasicProfileRules.R2203);
363 SoapHeaderBinding shb = (SoapHeaderBinding) value.Extensions.Find (typeof(SoapHeaderBinding));
365 Message hm = ctx.Services.GetMessage (shb.Message);
366 MessagePart mp = hm.FindPartByName (shb.Part);
367 portParts.Remove (mp);
368 if (mp != null && !mp.DefinedByElement)
369 ctx.ReportRuleViolation (value, BasicProfileRules.R2205);
372 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) value.Extensions.Find (typeof(SoapHeaderFaultBinding));
374 Message hm = ctx.Services.GetMessage (shfb.Message);
375 MessagePart mp = hm.FindPartByName (shfb.Part);
376 portParts.Remove (mp);
377 if (mp != null && !mp.DefinedByElement)
378 ctx.ReportRuleViolation (value, BasicProfileRules.R2205);
381 // TODO: SoapFaultBinding ??
384 Message FindMessage (ConformanceCheckContext ctx, MessageBinding mb)
386 PortType pt = ctx.Services.GetPortType (mb.OperationBinding.Binding.Type);
387 foreach (Operation op in pt.Operations)
388 if (op.IsBoundBy (mb.OperationBinding)) {
390 if (mb is InputBinding) om = op.Messages.Input;
391 else if (mb is OutputBinding) om = op.Messages.Output;
392 else if (mb is FaultBinding) om = op.Faults [mb.Name];
395 return ctx.Services.GetMessage (om.Message);
402 public override void Check (ConformanceCheckContext ctx, Operation value)
404 switch (value.Messages.Flow) {
405 case OperationFlow.SolicitResponse:
406 case OperationFlow.Notification:
407 ctx.ReportRuleViolation (value, BasicProfileRules.R2303);
411 CheckR2305 (ctx, value);
414 void CheckR2305 (ConformanceCheckContext ctx, Operation value)
416 string [] order = value.ParameterOrder;
417 ServiceDescription sd = value.PortType.ServiceDescription;
418 Message omitted = null;
419 foreach (OperationMessage m in value.Messages) {
421 continue; // it is doubtful, but R2305 is not to check such cases anyways.
422 Message msg = sd.Messages [m.Name];
424 continue; // it is doubtful, but R2305 is not to check such cases anyways.
425 foreach (MessagePart p in msg.Parts) {
426 if (order != null && Array.IndexOf (order, p.Name) >= 0)
428 if (omitted == null) {
432 ctx.ReportRuleViolation (value, BasicProfileRules.R2305);
438 public override void Check (ConformanceCheckContext ctx, OperationMessage value) { }
439 public override void Check (ConformanceCheckContext ctx, Port value) { }
441 public override void Check (ConformanceCheckContext ctx, PortType value)
443 ArrayList names = new ArrayList ();
444 foreach (Operation o in value.Operations) {
445 if (names.Contains (o.Name))
446 ctx.ReportRuleViolation (value, BasicProfileRules.R2304);
452 public override void Check (ConformanceCheckContext ctx, Service value) { }
454 public override void Check (ConformanceCheckContext ctx, XmlSchema s)
456 if (s.TargetNamespace == null || s.TargetNamespace == "") {
457 foreach (XmlSchemaObject ob in s.Items)
458 if (!(ob is XmlSchemaImport) && !(ob is XmlSchemaAnnotation)) {
459 ctx.ReportRuleViolation (s, BasicProfileRules.R2105);
465 public override void Check (ConformanceCheckContext ctx, XmlSchemaImport value)
467 // LAMESPEC: same here to Check() for Import.
468 XmlSchema doc = ctx.GetDocument (value.SchemaLocation, value.Namespace) as XmlSchema;
469 if (doc == null) ctx.ReportError (value, "Schema '" + value.SchemaLocation + "' not found");
472 public override void Check (ConformanceCheckContext ctx, XmlSchemaAttribute value)
474 CheckSchemaQName (ctx, value, value.RefName);
475 CheckSchemaQName (ctx, value, value.SchemaTypeName);
477 XmlAttribute[] uatts = value.UnhandledAttributes;
479 foreach (XmlAttribute at in uatts)
480 if (at.LocalName == "arrayType" && at.NamespaceURI == "http://schemas.xmlsoap.org/wsdl/")
481 ctx.ReportRuleViolation (value, BasicProfileRules.R2111);
485 public override void Check (ConformanceCheckContext ctx, XmlSchemaAttributeGroupRef value)
487 CheckSchemaQName (ctx, value, value.RefName);
490 public override void Check (ConformanceCheckContext ctx, XmlSchemaComplexContentExtension value)
492 CheckSchemaQName (ctx, value, value.BaseTypeName);
493 if (value.BaseTypeName.Namespace == "http://schemas.xmlsoap.org/soap/encoding/" && value.BaseTypeName.Name == "Array")
494 ctx.ReportRuleViolation (value, BasicProfileRules.R2110);
497 public override void Check (ConformanceCheckContext ctx, XmlSchemaComplexContentRestriction value)
499 CheckSchemaQName (ctx, value, value.BaseTypeName);
500 if (value.BaseTypeName.Namespace == "http://schemas.xmlsoap.org/soap/encoding/" && value.BaseTypeName.Name == "Array")
501 ctx.ReportRuleViolation (value, BasicProfileRules.R2110);
504 public override void Check (ConformanceCheckContext ctx, XmlSchemaElement value)
506 CheckSchemaQName (ctx, value, value.RefName);
507 CheckSchemaQName (ctx, value, value.SubstitutionGroup);
508 CheckSchemaQName (ctx, value, value.SchemaTypeName);
509 if (value.Name != null && value.Name.StartsWith ("ArrayOf", StringComparison.Ordinal))
510 ctx.ReportRuleViolation (value, BasicProfileRules.R2112);
513 public override void Check (ConformanceCheckContext ctx, XmlSchemaGroupRef value)
515 CheckSchemaQName (ctx, value, value.RefName);
518 public override void Check (ConformanceCheckContext ctx, XmlSchemaKeyref value)
520 CheckSchemaQName (ctx, value, value.Refer);
523 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleContentExtension value)
525 CheckSchemaQName (ctx, value, value.BaseTypeName);
528 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleContentRestriction value)
530 CheckSchemaQName (ctx, value, value.BaseTypeName);
533 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeList value)
535 CheckSchemaQName (ctx, value, value.ItemTypeName);
538 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeRestriction value)
540 CheckSchemaQName (ctx, value, value.BaseTypeName);
543 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeUnion value)
545 if (value.MemberTypes != null) {
546 foreach (XmlQualifiedName name in value.MemberTypes)
547 CheckSchemaQName (ctx, value, name);
553 void CheckWsdlQName (ConformanceCheckContext ctx, object element, XmlQualifiedName name)
555 if (name == null || name == XmlQualifiedName.Empty) return;
556 if (name.Namespace == "" || name.Namespace == XmlSchema.Namespace) return;
558 if (ctx.ServiceDescription.Types != null && ctx.ServiceDescription.Types.Schemas != null)
560 foreach (XmlSchema s in ctx.ServiceDescription.Types.Schemas)
562 if (s.TargetNamespace == name.Namespace) return;
563 foreach (XmlSchemaObject i in s.Includes)
564 if ((i is XmlSchemaImport) && ((XmlSchemaImport)i).Namespace == name.Namespace) return;
567 ctx.ReportRuleViolation (element, BasicProfileRules.R2101);
570 void CheckSchemaQName (ConformanceCheckContext ctx, object element, XmlQualifiedName name)
572 if (name == null || name == XmlQualifiedName.Empty) return;
573 if (name.Namespace == "" || name.Namespace == XmlSchema.Namespace) return;
574 if (ctx.CurrentSchema.TargetNamespace == name.Namespace) return;
576 foreach (XmlSchemaObject i in ctx.CurrentSchema.Includes)
577 if ((i is XmlSchemaImport) && ((XmlSchemaImport)i).Namespace == name.Namespace) return;
579 ctx.ReportRuleViolation (element, BasicProfileRules.R2102);
582 LiteralType GetLiteralBindingType (Binding b)
584 SoapBinding sb = (SoapBinding) b.Extensions.Find (typeof(SoapBinding));
585 SoapBindingStyle style = (sb != null) ? sb.Style : SoapBindingStyle.Document;
586 if (style == SoapBindingStyle.Default) style = SoapBindingStyle.Document;
588 foreach (OperationBinding ob in b.Operations) {
589 SoapOperationBinding sob = (SoapOperationBinding) ob.Extensions.Find (typeof(SoapOperationBinding));
590 if (sob.Style != SoapBindingStyle.Default && sob.Style != style)
591 return LiteralType.Inconsistent;
592 if (ob.Input != null) {
593 SoapBodyBinding sbb = (SoapBodyBinding) ob.Input.Extensions.Find (typeof(SoapBodyBinding));
594 if (sbb != null && sbb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
595 SoapFaultBinding sfb = (SoapFaultBinding) ob.Input.Extensions.Find (typeof(SoapFaultBinding));
596 if (sfb != null && sfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
597 SoapHeaderBinding shb = (SoapHeaderBinding) ob.Input.Extensions.Find (typeof(SoapHeaderBinding));
598 if (shb != null && shb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
599 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) ob.Input.Extensions.Find (typeof(SoapHeaderFaultBinding));
600 if (shfb != null && shfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
602 if (ob.Output != null) {
603 SoapBodyBinding sbb = (SoapBodyBinding) ob.Output.Extensions.Find (typeof(SoapBodyBinding));
604 if (sbb != null && sbb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
605 SoapFaultBinding sfb = (SoapFaultBinding) ob.Input.Extensions.Find (typeof(SoapFaultBinding));
606 if (sfb != null && sfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
607 SoapHeaderBinding shb = (SoapHeaderBinding) ob.Input.Extensions.Find (typeof(SoapHeaderBinding));
608 if (shb != null && shb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
609 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) ob.Input.Extensions.Find (typeof(SoapHeaderFaultBinding));
610 if (shfb != null && shfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
613 if (style == SoapBindingStyle.Document) return LiteralType.Document;
614 else return LiteralType.Rpc;
625 internal class BasicProfileRules
627 #region "Basic Profile 1.1 Section 4 (Service Description)"
629 // (BTW R1034 turned out to be a spec bug.)
631 // 4.1 Required Description
632 // Can't check: R0001
634 // 4.2 Document Structure
636 // R2028, R2029: schema conformance, depends on underlying XML
638 public static readonly ConformanceRule R2001 = new ConformanceRule (
640 "A DESCRIPTION MUST only use the WSDL \"import\" statement to import another WSDL description",
643 public static readonly ConformanceRule R2803 = new ConformanceRule (
645 "In a DESCRIPTION, the namespace attribute of the wsdl:import MUST NOT be a relative URI.",
648 public static readonly ConformanceRule R2002 = new ConformanceRule (
650 "To import XML Schema Definitions, a DESCRIPTION MUST use the XML Schema \"import\" statement",
653 // R2003: depends on ServiceDescription raw XML.
654 // R2004, R2009, R2010, R2011: requires schema resolution
655 // which depends on XmlResolver, while 1) XmlUrlResolver
656 // might not always be proper (e.g. network resolution) and
657 // 2) custom XmlResolver might resolve non-XML.
659 public static readonly ConformanceRule R2007 = new ConformanceRule (
661 "A DESCRIPTION MUST specify a non-empty location attribute on the wsdl:import element",
664 // R2008: denotes a possibility that cannot be verified.
666 // R2022, R2023, R4004: depends on underlying XML, which
667 // is impossible when ServiceDescription is already read
668 // (WebServiceInteroperability.CheckConformance() is the case).
670 public static readonly ConformanceRule R4005 = new ConformanceRule (
672 "A DESCRIPTION SHOULD NOT contain the namespace declaration xmlns:xml=\"http://www.w3.org/XML/1998/namespace\"",
675 // R4002, R4003: depends on underlying XML
677 public static readonly ConformanceRule R2005 = new ConformanceRule (
679 "The targetNamespace attribute on the wsdl:definitions element of a description that is being imported MUST have same the value as the namespace attribute on the wsdl:import element in the importing DESCRIPTION",
682 // R2030: is satisfied by API nature (DocumentableItem).
684 // R2025: cannot be checked.
686 public static readonly ConformanceRule R2026 = new ConformanceRule (
688 "A DESCRIPTION SHOULD NOT include extension elements with a wsdl:required attribute value of \"true\" on any WSDL construct (wsdl:binding, wsdl:portType, wsdl:message, wsdl:types or wsdl:import) that claims conformance to the Profile",
691 // R2027: is about the CONSUMER, cannot be checked.
695 public static readonly ConformanceRule R2101 = new ConformanceRule (
697 "A DESCRIPTION MUST NOT use QName references to elements in namespaces that have been neither imported, nor defined in the referring WSDL document",
700 public static readonly ConformanceRule R2102 = new ConformanceRule (
702 "A QName reference to a Schema component in a DESCRIPTION MUST use the namespace defined in the targetNamespace attribute on the xsd:schema element, or to a namespace defined in the namespace attribute on an xsd:import element within the xsd:schema element",
705 public static readonly ConformanceRule R2105 = new ConformanceRule (
707 "All xsd:schema elements contained in a wsdl:types element of a DESCRIPTION MUST have a targetNamespace attribute with a valid and non-null value, UNLESS the xsd:schema element has xsd:import and/or xsd:annotation as its only child element(s)",
710 public static readonly ConformanceRule R2110 = new ConformanceRule (
712 "In a DESCRIPTION, array declarations MUST NOT extend or restrict the soapenc:Array type",
715 public static readonly ConformanceRule R2111 = new ConformanceRule (
717 "In a DESCRIPTION, array declarations MUST NOT use wsdl:arrayType attribute in the type declaration",
720 public static readonly ConformanceRule R2112 = new ConformanceRule (
722 "In a DESCRIPTION, elements SHOULD NOT be named using the convention ArrayOfXXX.",
725 // R2113: is about ENVELOPE.
727 // R2114: is satisfied by our processor.
731 public static readonly ConformanceRule R2201 = new ConformanceRule (
733 "A document-literal binding in a DESCRIPTION MUST, in each of its soapbind:body element(s), have at most one part listed in the parts attribute, if the parts attribute is specified",
736 public static readonly ConformanceRule R2209 = new ConformanceRule (
738 "A wsdl:binding in a DESCRIPTION SHOULD bind every wsdl:part of a wsdl:message in the wsdl:portType to which it refers to one of soapbind:body, soapbind:header, soapbind:fault or soapbind:headerfault",
741 public static readonly ConformanceRule R2210 = new ConformanceRule (
743 "If a document-literal binding in a DESCRIPTION does not specify the parts attribute on a soapbind:body element, the corresponding abstract wsdl:message MUST define zero or one wsdl:parts",
746 // R2202: Suggestion.
748 public static readonly ConformanceRule R2203 = new ConformanceRule (
750 "An rpc-literal binding in a DESCRIPTION MUST refer, in its soapbind:body element(s), only to wsdl:part element(s) that have been defined using the type attribute",
753 // R2211: Related to ENVELOPE
754 // R2207: is about allowed condition (MAY).
756 public static readonly ConformanceRule R2204 = new ConformanceRule (
758 "A document-literal binding in a DESCRIPTION MUST refer, in each of its soapbind:body element(s), only to wsdl:part element(s) that have been defined using the element attribute",
761 // R2208: is about allowed condition (MAY).
762 // R2212, R2213, R2214: related to ENVELOPE
764 public static readonly ConformanceRule R2205 = new ConformanceRule (
766 "A wsdl:binding in a DESCRIPTION MUST refer, in each of its soapbind:header, soapbind:headerfault and soapbind:fault elements, only to wsdl:part element(s) that have been defined using the element attribute",
769 public static readonly ConformanceRule R2206 = new ConformanceRule (
771 "A wsdl:message in a DESCRIPTION containing a wsdl:part that uses the element attribute MUST refer, in that attribute, to a global element declaration",
776 // R2301: Related to ENVELOPE.
779 // btw it's not on Basic Profile TAD
780 public static readonly ConformanceRule R2303 = new ConformanceRule (
782 "A DESCRIPTION MUST NOT use Solicit-Response and Notification type operations in a wsdl:portType definition.",
785 public static readonly ConformanceRule R2304 = new ConformanceRule (
787 "A wsdl:portType in a DESCRIPTION MUST have operations with distinct values for their name attributes.",
790 public static readonly ConformanceRule R2305 = new ConformanceRule (
792 "A wsdl:operation element child of a wsdl:portType element in a DESCRIPTION MUST be constructed so that the parameterOrder attribute, if present, omits at most 1 wsdl:part from the output message.",
795 public static readonly ConformanceRule R2306 = new ConformanceRule (
797 "A wsdl:message in a DESCRIPTION MUST NOT specify both type and element attributes on the same wsdl:part.",
802 public static readonly ConformanceRule R2401 = new ConformanceRule (
804 "A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP Binding as defined in WSDL 1.1 Section 3.",
809 public static readonly ConformanceRule R2701 = new ConformanceRule (
811 "The wsdl:binding element in a DESCRIPTION MUST be constructed so that its soapbind:binding child element specifies the transport attribute",
814 public static readonly ConformanceRule R2702 = new ConformanceRule (
816 "A wsdl:binding element in a DESCRIPTION MUST specify the HTTP transport protocol with SOAP binding. Specifically, the transport attribute of its soapbind:binding child MUST have the value \"http://schemas.xmlsoap.org/soap/http\"",
819 public static readonly ConformanceRule R2705 = new ConformanceRule (
821 "A wsdl:binding in a DESCRIPTION MUST use either be a rpc-literal binding or a document-literal binding",
824 public static readonly ConformanceRule R2706 = new ConformanceRule (
826 "A wsdl:binding in a DESCRIPTION MUST use the value of \"literal\" for the use attribute in all soapbind:body, soapbind:fault, soapbind:header and soapbind:headerfault elements",
829 // R2709: Suggestion.
831 public static readonly ConformanceRule R2710 = new ConformanceRule (
833 "The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.",
836 public static readonly ConformanceRule R2711 = new ConformanceRule (
838 "A DESCRIPTION SHOULD NOT have more than one wsdl:port with the same value for the location attribute of the soapbind:address element.",
841 // R2712: related to ENVELOPE.
842 // R2714: related to INSTANCE.
843 // R2750, R2727: related to CONSUMER.
845 public static readonly ConformanceRule R2716 = new ConformanceRule (
847 "A document-literal binding in a DESCRIPTION MUST NOT have the namespace attribute specified on contained soapbind:body, soapbind:header, soapbind:headerfault and soapbind:fault elements.",
850 public static readonly ConformanceRule R2717 = new ConformanceRule (
852 "An rpc-literal binding in a DESCRIPTION MUST have the namespace attribute specified, the value of which MUST be an absolute URI, on contained soapbind:body elements.",
855 public static readonly ConformanceRule R2726 = new ConformanceRule (
857 "An rpc-literal binding in a DESCRIPTION MUST NOT have the namespace attribute specified on contained soapbind:header, soapbind:headerfault and soapbind:fault elements.",
861 public static readonly ConformanceRule R2718 = new ConformanceRule (
863 "A wsdl:binding in a DESCRIPTION MUST have the same set of wsdl:operations as the wsdl:portType to which it refers.",
867 // R2719: is about allowed condition (MAY).
868 // R2740, R2741: no way to detect known faults here.
869 // R2742, R2743: related to ENVELOPE.
871 public static readonly ConformanceRule R2720 = new ConformanceRule (
873 "A wsdl:binding in a DESCRIPTION MUST use the part attribute with a schema type of \"NMTOKEN\" on all contained soapbind:header and soapbind:headerfault elements.",
877 // R2749: is satisfied by API nature.
879 public static readonly ConformanceRule R2721 = new ConformanceRule (
881 "A wsdl:binding in a DESCRIPTION MUST have the name attribute specified on all contained soapbind:fault elements.",
884 public static readonly ConformanceRule R2754 = new ConformanceRule (
886 "In a DESCRIPTION, the value of the name attribute on a soapbind:fault element MUST match the value of the name attribute on its parent wsdl:fault element.",
889 // R2722: is about allowed condition (MAY).
891 public static readonly ConformanceRule R2723 = new ConformanceRule (
893 "f in a wsdl:binding in a DESCRIPTION the use attribute on a contained soapbind:fault element is present, its value MUST be \"literal\".",
896 // R2707: is satisfied by our implementation.
897 // R2724, R2725: related to INSTANCE.
898 // R2729, R2735: related to ENVELOPE.
899 // R2755: related to MESSAGE.
900 // R2737, R2738, R2739, R2753: related to ENVELOPE.
901 // R2751, R2752: related to ENVELOPE.
902 // R2744, R2745: related to MESSAGE.
903 // R2747, R2748: related to CONSUMER.
905 // 4.8 Use of XML Schema
907 // R2800: satisfied by API nature.
914 Below are the combination of these documents:
915 http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html
916 http://www.ws-i.org/Testing/Tools/2005/01/BP11_TAD_1-1.htm
918 TAD No. component recomm. WS-I Req.
919 BP2010 portType R2304
923 BP2014 operation R2305
924 BP2017 binding R2705,R2706
925 BP2018 definitions R2023,R2030
928 BP2021 binding R2720,R2749
931 BP2034 definitions rec. R1034,R4005
933 BP2101 definitions R2001
934 BP2103 definitions R2003
935 BP2104 definitions R2005
936 BP2105 definitions R2022,R2030
938 BP2108 types R2110,R2111
939 BP2110 types rec. R2112
943 BP2114 binding rec. R2209
951 BP2123 definitions rec. R2026