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; }
49 public override void Check (ConformanceCheckContext ctx, Import value)
51 if (value.Location == "" || value.Location == null) {
52 ctx.ReportRuleViolation (value, BasicProfileRules.R2007);
56 if (!new Uri (value.Namespace, UriKind.RelativeOrAbsolute).IsAbsoluteUri)
57 ctx.ReportRuleViolation (value, BasicProfileRules.R2803);
59 object doc = ctx.GetDocument (value.Location);
60 if (doc == null) ctx.ReportError (value, "Document '" + value.Location + "' not found");
63 ctx.ReportRuleViolation (value, BasicProfileRules.R2002);
65 ServiceDescription imported = doc as ServiceDescription;
66 if (imported == null) {
67 ctx.ReportRuleViolation (value, BasicProfileRules.R2001);
71 if (imported.TargetNamespace != value.Namespace)
72 ctx.ReportRuleViolation (value, BasicProfileRules.R2005);
75 public override void Check (ConformanceCheckContext ctx, ServiceDescription value)
77 // R4005 (and R1034, which turned out to be redundant)
78 if (value.Namespaces != null)
79 foreach (XmlQualifiedName qname in value.Namespaces.ToArray ())
80 if (qname.Namespace == "http://www.w3.org/XML/1998/namespace")
81 ctx.ReportRuleViolation (value, BasicProfileRules.R4005);
83 CheckDuplicateSoapAddressBinding (ctx, value);
86 void CheckDuplicateSoapAddressBinding (ConformanceCheckContext ctx, ServiceDescription value)
88 ArrayList locations = new ArrayList ();
89 foreach (PortType p in value.PortTypes) {
90 SoapAddressBinding b = (SoapAddressBinding) p.Extensions.Find (typeof (SoapAddressBinding));
91 if (b == null || b.Location == null || b.Location.Length == 0)
93 if (locations.Contains (b.Location)) {
94 ctx.ReportRuleViolation (value, BasicProfileRules.R2711);
95 // One report for one ServiceDescription should be enough.
98 locations.Add (b.Location);
102 public override void Check (ConformanceCheckContext ctx, ServiceDescriptionFormatExtension value)
105 ctx.ReportRuleViolation (value, BasicProfileRules.R2026);
108 public override void Check (ConformanceCheckContext ctx, MessagePart value)
110 CheckWsdlQName (ctx, value, value.Type);
111 CheckWsdlQName (ctx, value, value.Element);
113 if (value.DefinedByElement && value.Element.Namespace == XmlSchema.Namespace)
114 ctx.ReportRuleViolation (value, BasicProfileRules.R2206);
116 if (value.Type != null && value.Type != XmlQualifiedName.Empty &&
117 value.Element != null && value.Element != XmlQualifiedName.Empty)
118 ctx.ReportRuleViolation (value, BasicProfileRules.R2306);
121 public override void Check (ConformanceCheckContext ctx, Types value)
125 public override void Check (ConformanceCheckContext ctx, Message value)
129 public override void Check (ConformanceCheckContext ctx, Binding value)
131 SoapBinding sb = (SoapBinding) value.Extensions.Find (typeof(SoapBinding));
133 ctx.ReportRuleViolation (value, BasicProfileRules.R2401);
136 if (sb.Transport == null || sb.Transport == "") {
137 ctx.ReportRuleViolation (value, BasicProfileRules.R2701);
141 if (sb.Transport != "http://schemas.xmlsoap.org/soap/http")
142 ctx.ReportRuleViolation (value, BasicProfileRules.R2702);
144 LiteralType type = GetLiteralBindingType (value);
145 if (type == LiteralType.NotLiteral)
146 ctx.ReportRuleViolation (value, BasicProfileRules.R2706);
147 else if (type == LiteralType.Inconsistent)
148 ctx.ReportRuleViolation (value, BasicProfileRules.R2705);
150 // Collect all parts referenced from this type
152 Hashtable parts = new Hashtable ();
153 PortType port = ctx.Services.GetPortType (value.Type);
154 foreach (Operation op in port.Operations) {
155 foreach (OperationMessage om in op.Messages) {
156 Message msg = ctx.Services.GetMessage (om.Message);
157 foreach (MessagePart part in msg.Parts)
158 parts.Add (part,part);
162 foreach (OperationBinding ob in value.Operations) {
163 if (ob.Input != null) CheckMessageBinding (ctx, parts, ob.Input);
164 if (ob.Output != null) CheckMessageBinding (ctx, parts, ob.Output);
165 foreach (FaultBinding fb in ob.Faults)
166 CheckMessageBinding (ctx, parts, fb);
170 ctx.ReportRuleViolation (value, BasicProfileRules.R2209);
172 // check existence of corresponding operation in portType for each binding operation
173 if (CheckCorrespondingOperationsForBinding (ctx, value, port))
174 ctx.ReportRuleViolation (value, BasicProfileRules.R2718);
176 // check duplicate operation signature.
177 ArrayList sigs = new ArrayList ();
178 foreach (OperationBinding ob in value.Operations) {
179 if (sigs.Contains (ob.Name))
180 ctx.ReportRuleViolation (value, BasicProfileRules.R2710);
184 // check namespace declarations.
186 case LiteralType.Document:
187 case LiteralType.Rpc:
188 CheckSoapBindingExtensions (ctx, value, type);
193 bool CheckCorrespondingOperationsForBinding (ConformanceCheckContext ctx, Binding value, PortType port)
195 if (value.Operations.Count != port.Operations.Count)
197 foreach (OperationBinding b in value.Operations) {
198 Operation op = port.Operations.Find (b.Name);
204 msg = op.Messages.Input != null;
205 bind = b.Input != null;
209 msg = op.Messages.Output != null;
210 bind = b.Output != null;
214 foreach (FaultBinding fb in b.Faults)
215 if (op.Messages.Find (fb.Name) == null)
221 void CheckSoapBindingExtensions (ConformanceCheckContext ctx, Binding value, LiteralType type)
223 bool violationNS = false;
224 bool violation2717 = false;
225 bool violation2720 = false;
226 bool violation2721 = false;
228 foreach (OperationBinding op in value.Operations) {
229 SoapBodyBinding sbb = op.Extensions.Find (typeof (SoapBodyBinding)) as SoapBodyBinding;
231 if (type == LiteralType.Document && sbb.Namespace != null)
233 if (type == LiteralType.Rpc && sbb.Namespace == null)
234 violation2717 = true;
237 SoapHeaderBinding shb = op.Extensions.Find (typeof (SoapHeaderBinding)) as SoapHeaderBinding;
239 violationNS |= shb.Namespace != null;
240 violation2720 |= !IsValidPart (shb.Part);
243 SoapHeaderFaultBinding sfhb = op.Extensions.Find (typeof (SoapHeaderFaultBinding)) as SoapHeaderFaultBinding;
245 violationNS |= sfhb.Namespace != null;
246 violation2720 |= !IsValidPart (sfhb.Part);
249 SoapFaultBinding sfb = op.Extensions.Find (typeof (SoapFaultBinding)) as SoapFaultBinding;
251 violation2721 |= sfb.Name == null;
252 violationNS |= sfb.Namespace != null;
256 ctx.ReportRuleViolation (value,
257 type == LiteralType.Document ?
258 BasicProfileRules.R2716 :
259 BasicProfileRules.R2726);
261 ctx.ReportRuleViolation (value, BasicProfileRules.R2717);
263 ctx.ReportRuleViolation (value, BasicProfileRules.R2720);
265 ctx.ReportRuleViolation (value, BasicProfileRules.R2721);
268 bool IsValidPart (string part)
273 XmlConvert.VerifyNMTOKEN (part);
275 } catch (XmlException) {
280 public override void Check (ConformanceCheckContext ctx, OperationBinding value)
284 foreach (FaultBinding fb in value.Faults) {
285 SoapFaultBinding sfb = (SoapFaultBinding) value.Extensions.Find (typeof (SoapFaultBinding));
288 r2754 |= sfb.Name != fb.Name;
289 r2723 |= sfb.Use == SoapBindingUse.Encoded;
292 ctx.ReportRuleViolation (value, BasicProfileRules.R2754);
294 ctx.ReportRuleViolation (value, BasicProfileRules.R2723);
297 void CheckMessageBinding (ConformanceCheckContext ctx, Hashtable portParts, MessageBinding value)
299 SoapBodyBinding sbb = (SoapBodyBinding) value.Extensions.Find (typeof(SoapBodyBinding));
300 Message msg = FindMessage (ctx, value);
301 LiteralType bt = GetLiteralBindingType (value.OperationBinding.Binding);
305 if (bt == LiteralType.Document)
307 if (sbb.Parts != null && sbb.Parts.Length > 1)
308 ctx.ReportRuleViolation (value, BasicProfileRules.R2201);
310 if (sbb.Parts == null) {
311 if (msg.Parts != null && msg.Parts.Count > 1)
312 ctx.ReportRuleViolation (value, BasicProfileRules.R2210);
313 if (msg.Parts.Count == 1)
314 portParts.Remove (msg.Parts[0]);
317 if (sbb.Parts.Length == 0 && msg.Parts.Count == 1) {
318 portParts.Remove (msg.Parts[0]);
320 foreach (string part in sbb.Parts) {
321 MessagePart mp = msg.FindPartByName (part);
322 portParts.Remove (mp);
323 if (!mp.DefinedByElement)
324 ctx.ReportRuleViolation (value, BasicProfileRules.R2204);
329 else if (bt == LiteralType.Rpc)
331 if (sbb.Parts != null) {
332 foreach (string part in sbb.Parts) {
333 MessagePart mp = msg.FindPartByName (part);
334 portParts.Remove (mp);
335 if (!mp.DefinedByType)
336 ctx.ReportRuleViolation (value, BasicProfileRules.R2203);
342 SoapHeaderBinding shb = (SoapHeaderBinding) value.Extensions.Find (typeof(SoapHeaderBinding));
344 Message hm = ctx.Services.GetMessage (shb.Message);
345 MessagePart mp = hm.FindPartByName (shb.Part);
346 portParts.Remove (mp);
347 if (mp != null && !mp.DefinedByElement)
348 ctx.ReportRuleViolation (value, BasicProfileRules.R2205);
351 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) value.Extensions.Find (typeof(SoapHeaderFaultBinding));
353 Message hm = ctx.Services.GetMessage (shfb.Message);
354 MessagePart mp = hm.FindPartByName (shfb.Part);
355 portParts.Remove (mp);
356 if (mp != null && !mp.DefinedByElement)
357 ctx.ReportRuleViolation (value, BasicProfileRules.R2205);
360 // TODO: SoapFaultBinding ??
363 Message FindMessage (ConformanceCheckContext ctx, MessageBinding mb)
365 PortType pt = ctx.Services.GetPortType (mb.OperationBinding.Binding.Type);
366 foreach (Operation op in pt.Operations)
367 if (op.IsBoundBy (mb.OperationBinding)) {
369 if (mb is InputBinding) om = op.Messages.Input;
370 else if (mb is OutputBinding) om = op.Messages.Output;
371 else if (mb is FaultBinding) om = op.Faults [mb.Name];
374 return ctx.Services.GetMessage (om.Message);
381 public override void Check (ConformanceCheckContext ctx, Operation value)
383 switch (value.Messages.Flow) {
384 case OperationFlow.SolicitResponse:
385 case OperationFlow.Notification:
386 ctx.ReportRuleViolation (value, BasicProfileRules.R2303);
390 CheckR2305 (ctx, value);
393 void CheckR2305 (ConformanceCheckContext ctx, Operation value)
395 string [] order = value.ParameterOrder;
396 if (order == null || order.Length == 0)
398 bool omitted = false;
399 bool violation = false;
400 for (int i = 0; i < value.Messages.Count; i++) {
401 OperationMessage msg = value.Messages [i];
402 if (msg.Name == null) {
408 else if (order [omitted ? i - 1 : i] != msg.Name)
412 ctx.ReportRuleViolation (value, BasicProfileRules.R2305);
415 public override void Check (ConformanceCheckContext ctx, OperationMessage value) { }
416 public override void Check (ConformanceCheckContext ctx, Port value) { }
418 public override void Check (ConformanceCheckContext ctx, PortType value)
420 ArrayList names = new ArrayList ();
421 foreach (Operation o in value.Operations) {
422 if (names.Contains (o.Name))
423 ctx.ReportRuleViolation (value, BasicProfileRules.R2304);
429 public override void Check (ConformanceCheckContext ctx, Service value) { }
431 public override void Check (ConformanceCheckContext ctx, XmlSchema s)
433 if (s.TargetNamespace == null || s.TargetNamespace == "") {
434 foreach (XmlSchemaObject ob in s.Items)
435 if (!(ob is XmlSchemaImport) && !(ob is XmlSchemaAnnotation)) {
436 ctx.ReportRuleViolation (s, BasicProfileRules.R2105);
442 public override void Check (ConformanceCheckContext ctx, XmlSchemaImport value)
444 XmlSchema doc = ctx.GetDocument (value.SchemaLocation) as XmlSchema;
445 if (doc == null) ctx.ReportError (value, "Schema '" + value.SchemaLocation + "' not found");
448 public override void Check (ConformanceCheckContext ctx, XmlSchemaAttribute value)
450 CheckSchemaQName (ctx, value, value.RefName);
451 CheckSchemaQName (ctx, value, value.SchemaTypeName);
453 XmlAttribute[] uatts = value.UnhandledAttributes;
455 foreach (XmlAttribute at in uatts)
456 if (at.LocalName == "arrayType" && at.NamespaceURI == "http://schemas.xmlsoap.org/wsdl/")
457 ctx.ReportRuleViolation (value, BasicProfileRules.R2111);
461 public override void Check (ConformanceCheckContext ctx, XmlSchemaAttributeGroupRef value)
463 CheckSchemaQName (ctx, value, value.RefName);
466 public override void Check (ConformanceCheckContext ctx, XmlSchemaComplexContentExtension value)
468 CheckSchemaQName (ctx, value, value.BaseTypeName);
469 if (value.BaseTypeName.Namespace == "http://schemas.xmlsoap.org/soap/encoding/" && value.BaseTypeName.Name == "Array")
470 ctx.ReportRuleViolation (value, BasicProfileRules.R2110);
473 public override void Check (ConformanceCheckContext ctx, XmlSchemaComplexContentRestriction value)
475 CheckSchemaQName (ctx, value, value.BaseTypeName);
476 if (value.BaseTypeName.Namespace == "http://schemas.xmlsoap.org/soap/encoding/" && value.BaseTypeName.Name == "Array")
477 ctx.ReportRuleViolation (value, BasicProfileRules.R2110);
480 public override void Check (ConformanceCheckContext ctx, XmlSchemaElement value)
482 CheckSchemaQName (ctx, value, value.RefName);
483 CheckSchemaQName (ctx, value, value.SubstitutionGroup);
484 CheckSchemaQName (ctx, value, value.SchemaTypeName);
485 if (value.Name != null && value.Name.StartsWith ("ArrayOf", StringComparison.Ordinal))
486 ctx.ReportRuleViolation (value, BasicProfileRules.R2112);
489 public override void Check (ConformanceCheckContext ctx, XmlSchemaGroupRef value)
491 CheckSchemaQName (ctx, value, value.RefName);
494 public override void Check (ConformanceCheckContext ctx, XmlSchemaKeyref value)
496 CheckSchemaQName (ctx, value, value.Refer);
499 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleContentExtension value)
501 CheckSchemaQName (ctx, value, value.BaseTypeName);
504 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleContentRestriction value)
506 CheckSchemaQName (ctx, value, value.BaseTypeName);
509 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeList value)
511 CheckSchemaQName (ctx, value, value.ItemTypeName);
514 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeRestriction value)
516 CheckSchemaQName (ctx, value, value.BaseTypeName);
519 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeUnion value)
521 if (value.MemberTypes != null) {
522 foreach (XmlQualifiedName name in value.MemberTypes)
523 CheckSchemaQName (ctx, value, name);
529 void CheckWsdlQName (ConformanceCheckContext ctx, object element, XmlQualifiedName name)
531 if (name == null || name == XmlQualifiedName.Empty) return;
532 if (name.Namespace == "" || name.Namespace == XmlSchema.Namespace) return;
534 if (ctx.ServiceDescription.Types != null && ctx.ServiceDescription.Types.Schemas != null)
536 foreach (XmlSchema s in ctx.ServiceDescription.Types.Schemas)
538 if (s.TargetNamespace == name.Namespace) return;
539 foreach (XmlSchemaObject i in s.Includes)
540 if ((i is XmlSchemaImport) && ((XmlSchemaImport)i).Namespace == name.Namespace) return;
543 ctx.ReportRuleViolation (element, BasicProfileRules.R2101);
546 void CheckSchemaQName (ConformanceCheckContext ctx, object element, XmlQualifiedName name)
548 if (name == null || name == XmlQualifiedName.Empty) return;
549 if (name.Namespace == "" || name.Namespace == XmlSchema.Namespace) return;
550 if (ctx.CurrentSchema.TargetNamespace == name.Namespace) return;
552 foreach (XmlSchemaObject i in ctx.CurrentSchema.Includes)
553 if ((i is XmlSchemaImport) && ((XmlSchemaImport)i).Namespace == name.Namespace) return;
555 ctx.ReportRuleViolation (element, BasicProfileRules.R2102);
558 LiteralType GetLiteralBindingType (Binding b)
560 SoapBinding sb = (SoapBinding) b.Extensions.Find (typeof(SoapBinding));
561 SoapBindingStyle style = (sb != null) ? sb.Style : SoapBindingStyle.Document;
562 if (style == SoapBindingStyle.Default) style = SoapBindingStyle.Document;
564 foreach (OperationBinding ob in b.Operations) {
565 SoapOperationBinding sob = (SoapOperationBinding) ob.Extensions.Find (typeof(SoapOperationBinding));
566 if (sob.Style != SoapBindingStyle.Default && sob.Style != style)
567 return LiteralType.Inconsistent;
568 if (ob.Input != null) {
569 SoapBodyBinding sbb = (SoapBodyBinding) ob.Input.Extensions.Find (typeof(SoapBodyBinding));
570 if (sbb != null && sbb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
571 SoapFaultBinding sfb = (SoapFaultBinding) ob.Input.Extensions.Find (typeof(SoapFaultBinding));
572 if (sfb != null && sfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
573 SoapHeaderBinding shb = (SoapHeaderBinding) ob.Input.Extensions.Find (typeof(SoapHeaderBinding));
574 if (shb != null && shb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
575 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) ob.Input.Extensions.Find (typeof(SoapHeaderFaultBinding));
576 if (shfb != null && shfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
578 if (ob.Output != null) {
579 SoapBodyBinding sbb = (SoapBodyBinding) ob.Output.Extensions.Find (typeof(SoapBodyBinding));
580 if (sbb != null && sbb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
581 SoapFaultBinding sfb = (SoapFaultBinding) ob.Input.Extensions.Find (typeof(SoapFaultBinding));
582 if (sfb != null && sfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
583 SoapHeaderBinding shb = (SoapHeaderBinding) ob.Input.Extensions.Find (typeof(SoapHeaderBinding));
584 if (shb != null && shb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
585 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) ob.Input.Extensions.Find (typeof(SoapHeaderFaultBinding));
586 if (shfb != null && shfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
589 if (style == SoapBindingStyle.Document) return LiteralType.Document;
590 else return LiteralType.Rpc;
601 internal class BasicProfileRules
603 #region "Basic Profile 1.1 Section 4 (Service Description)"
605 // (BTW R1034 turned out to be a spec bug.)
607 // 4.1 Required Description
608 // Can't check: R0001
610 // 4.2 Document Structure
612 // R2028, R2029: schema conformance, depends on underlying XML
614 public static readonly ConformanceRule R2001 = new ConformanceRule (
616 "A DESCRIPTION MUST only use the WSDL \"import\" statement to import another WSDL description",
619 public static readonly ConformanceRule R2803 = new ConformanceRule (
621 "In a DESCRIPTION, the namespace attribute of the wsdl:import MUST NOT be a relative URI.",
624 public static readonly ConformanceRule R2002 = new ConformanceRule (
626 "To import XML Schema Definitions, a DESCRIPTION MUST use the XML Schema \"import\" statement",
629 // R2003: depends on ServiceDescription raw XML.
630 // R2004, R2009, R2010, R2011: requires schema resolution
631 // which depends on XmlResolver, while 1) XmlUrlResolver
632 // might not always be proper (e.g. network resolution) and
633 // 2) custom XmlResolver might resolve non-XML.
635 public static readonly ConformanceRule R2007 = new ConformanceRule (
637 "A DESCRIPTION MUST specify a non-empty location attribute on the wsdl:import element",
640 // R2008: denotes a possibility that cannot be verified.
642 // R2022, R2023, R4004: depends on underlying XML, which
643 // is impossible when ServiceDescription is already read
644 // (WebServiceInteroperability.CheckConformance() is the case).
646 public static readonly ConformanceRule R4005 = new ConformanceRule (
648 "A DESCRIPTION SHOULD NOT contain the namespace declaration xmlns:xml=\"http://www.w3.org/XML/1998/namespace\"",
651 // R4002, R4003: depends on underlying XML
653 public static readonly ConformanceRule R2005 = new ConformanceRule (
655 "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",
658 // R2030: is satisfied by API nature (DocumentableItem).
660 // R2025: cannot be checked.
662 public static readonly ConformanceRule R2026 = new ConformanceRule (
664 "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",
667 // R2027: is about the CONSUMER, cannot be checked.
671 public static readonly ConformanceRule R2101 = new ConformanceRule (
673 "A DESCRIPTION MUST NOT use QName references to elements in namespaces that have been neither imported, nor defined in the referring WSDL document",
676 public static readonly ConformanceRule R2102 = new ConformanceRule (
678 "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",
681 public static readonly ConformanceRule R2105 = new ConformanceRule (
683 "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)",
686 public static readonly ConformanceRule R2110 = new ConformanceRule (
688 "In a DESCRIPTION, array declarations MUST NOT extend or restrict the soapenc:Array type",
691 public static readonly ConformanceRule R2111 = new ConformanceRule (
693 "In a DESCRIPTION, array declarations MUST NOT use wsdl:arrayType attribute in the type declaration",
696 public static readonly ConformanceRule R2112 = new ConformanceRule (
698 "In a DESCRIPTION, elements SHOULD NOT be named using the convention ArrayOfXXX.",
701 // R2113: is about ENVELOPE.
703 // R2114: is satisfied by our processor.
707 public static readonly ConformanceRule R2201 = new ConformanceRule (
709 "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",
712 public static readonly ConformanceRule R2209 = new ConformanceRule (
714 "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",
717 public static readonly ConformanceRule R2210 = new ConformanceRule (
719 "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",
722 // R2202: Suggestion.
724 public static readonly ConformanceRule R2203 = new ConformanceRule (
726 "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",
729 // R2211: Related to ENVELOPE
730 // R2207: is about allowed condition (MAY).
732 public static readonly ConformanceRule R2204 = new ConformanceRule (
734 "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",
737 // R2208: is about allowed condition (MAY).
738 // R2212, R2213, R2214: related to ENVELOPE
740 public static readonly ConformanceRule R2205 = new ConformanceRule (
742 "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",
745 public static readonly ConformanceRule R2206 = new ConformanceRule (
747 "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",
752 // R2301: Related to ENVELOPE.
755 // btw it's not on Basic Profile TAD
756 public static readonly ConformanceRule R2303 = new ConformanceRule (
758 "A DESCRIPTION MUST NOT use Solicit-Response and Notification type operations in a wsdl:portType definition.",
761 public static readonly ConformanceRule R2304 = new ConformanceRule (
763 "A wsdl:portType in a DESCRIPTION MUST have operations with distinct values for their name attributes.",
766 public static readonly ConformanceRule R2305 = new ConformanceRule (
768 "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.",
771 public static readonly ConformanceRule R2306 = new ConformanceRule (
773 "A wsdl:message in a DESCRIPTION MUST NOT specify both type and element attributes on the same wsdl:part.",
778 public static readonly ConformanceRule R2401 = new ConformanceRule (
780 "A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP Binding as defined in WSDL 1.1 Section 3.",
785 public static readonly ConformanceRule R2701 = new ConformanceRule (
787 "The wsdl:binding element in a DESCRIPTION MUST be constructed so that its soapbind:binding child element specifies the transport attribute",
790 public static readonly ConformanceRule R2702 = new ConformanceRule (
792 "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\"",
795 public static readonly ConformanceRule R2705 = new ConformanceRule (
797 "A wsdl:binding in a DESCRIPTION MUST use either be a rpc-literal binding or a document-literal binding",
800 public static readonly ConformanceRule R2706 = new ConformanceRule (
802 "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",
805 // R2709: Suggestion.
807 public static readonly ConformanceRule R2710 = new ConformanceRule (
809 "The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.",
812 public static readonly ConformanceRule R2711 = new ConformanceRule (
814 "A DESCRIPTION SHOULD NOT have more than one wsdl:port with the same value for the location attribute of the soapbind:address element.",
817 // R2712: related to ENVELOPE.
818 // R2714: related to INSTANCE.
819 // R2750, R2727: related to CONSUMER.
821 public static readonly ConformanceRule R2716 = new ConformanceRule (
823 "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.",
826 public static readonly ConformanceRule R2717 = new ConformanceRule (
828 "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.",
831 public static readonly ConformanceRule R2726 = new ConformanceRule (
833 "An rpc-literal binding in a DESCRIPTION MUST NOT have the namespace attribute specified on contained soapbind:header, soapbind:headerfault and soapbind:fault elements.",
837 public static readonly ConformanceRule R2718 = new ConformanceRule (
839 "A wsdl:binding in a DESCRIPTION MUST have the same set of wsdl:operations as the wsdl:portType to which it refers.",
843 // R2719: is about allowed condition (MAY).
844 // R2740, R2741: no way to detect known faults here.
845 // R2742, R2743: related to ENVELOPE.
847 public static readonly ConformanceRule R2720 = new ConformanceRule (
849 "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.",
853 // R2749: is satisfied by API nature.
855 public static readonly ConformanceRule R2721 = new ConformanceRule (
857 "A wsdl:binding in a DESCRIPTION MUST have the name attribute specified on all contained soapbind:fault elements.",
860 public static readonly ConformanceRule R2754 = new ConformanceRule (
862 "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.",
865 // R2722: is about allowed condition (MAY).
867 public static readonly ConformanceRule R2723 = new ConformanceRule (
869 "f in a wsdl:binding in a DESCRIPTION the use attribute on a contained soapbind:fault element is present, its value MUST be \"literal\".",
872 // R2707: is satisfied by our implementation.
873 // R2724, R2725: related to INSTANCE.
874 // R2729, R2735: related to ENVELOPE.
875 // R2755: related to MESSAGE.
876 // R2737, R2738, R2739, R2753: related to ENVELOPE.
877 // R2751, R2752: related to ENVELOPE.
878 // R2744, R2745: related to MESSAGE.
879 // R2747, R2748: related to CONSUMER.
881 // 4.8 Use of XML Schema
883 // R2800: satisfied by API nature.
890 Below are the combination of these documents:
891 http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html
892 http://www.ws-i.org/Testing/Tools/2005/01/BP11_TAD_1-1.htm
894 TAD No. component recomm. WS-I Req.
895 BP2010 portType R2304
899 BP2014 operation R2305
900 BP2017 binding R2705,R2706
901 BP2018 definitions R2023,R2030
904 BP2021 binding R2720,R2749
907 BP2034 definitions rec. R1034,R4005
909 BP2101 definitions R2001
910 BP2103 definitions R2003
911 BP2104 definitions R2005
912 BP2105 definitions R2022,R2030
914 BP2108 types R2110,R2111
915 BP2110 types rec. R2112
919 BP2114 binding rec. R2209
927 BP2123 definitions rec. R2026