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.
35 using System.Xml.Schema;
36 using System.Xml.Serialization;
38 using System.Collections;
40 namespace System.Web.Services.Description
42 internal class BasicProfileChecker: ConformanceChecker
44 public static BasicProfileChecker Instance = new BasicProfileChecker ();
46 public override WsiProfiles Claims {
47 get { return WsiProfiles.BasicProfile1_1; }
51 private string GetAbsoluteUri (string baseUri, string relativeUri)
53 string actualBaseUri = baseUri ?? Path.GetFullPath (".") + Path.DirectorySeparatorChar;
54 Uri uri = new Uri (new Uri (actualBaseUri), relativeUri);
55 return uri.ToString ();
59 public override void Check (ConformanceCheckContext ctx, Import value)
61 if (value.Location == "" || value.Location == null) {
62 ctx.ReportRuleViolation (value, BasicProfileRules.R2007);
66 if (!new Uri (value.Namespace, UriKind.RelativeOrAbsolute).IsAbsoluteUri)
67 ctx.ReportRuleViolation (value, BasicProfileRules.R2803);
69 // LAMESPEC: RetrievalUrl does not seem to help here (in .NET)
70 //ServiceDescription importer = value.ServiceDescription;
71 //string absUri = GetAbsoluteUri (importer != null ? importer.RetrievalUrl : null, value.Location);
72 object doc = ctx.GetDocument (/*absUri*/value.Location, value.Namespace);
73 if (doc == null) // and looks like .net ignores non-resolvable documentation... I dunno if it makes sense. I don't care :/
74 return; //ctx.ReportError (value, "Document '" + value.Location + "' not found");
77 ctx.ReportRuleViolation (value, BasicProfileRules.R2002);
79 ServiceDescription imported = doc as ServiceDescription;
80 if (imported == null) {
81 ctx.ReportRuleViolation (value, BasicProfileRules.R2001);
85 if (imported.TargetNamespace != value.Namespace)
86 ctx.ReportRuleViolation (value, BasicProfileRules.R2005);
89 public override void Check (ConformanceCheckContext ctx, ServiceDescription value)
91 // R4005 (and R1034, which turned out to be redundant)
92 if (value.Namespaces != null)
93 foreach (XmlQualifiedName qname in value.Namespaces.ToArray ())
94 if (qname.Namespace == "http://www.w3.org/XML/1998/namespace")
95 ctx.ReportRuleViolation (value, BasicProfileRules.R4005);
97 CheckDuplicateSoapAddressBinding (ctx, value);
100 void CheckDuplicateSoapAddressBinding (ConformanceCheckContext ctx, ServiceDescription value)
102 ArrayList locations = new ArrayList ();
103 foreach (PortType p in value.PortTypes) {
104 SoapAddressBinding b = (SoapAddressBinding) p.Extensions.Find (typeof (SoapAddressBinding));
105 if (b == null || b.Location == null || b.Location.Length == 0)
107 if (locations.Contains (b.Location)) {
108 ctx.ReportRuleViolation (value, BasicProfileRules.R2711);
109 // One report for one ServiceDescription should be enough.
112 locations.Add (b.Location);
116 public override void Check (ConformanceCheckContext ctx, ServiceDescriptionFormatExtension value)
119 ctx.ReportRuleViolation (value, BasicProfileRules.R2026);
122 public override void Check (ConformanceCheckContext ctx, MessagePart value)
124 CheckWsdlQName (ctx, value, value.Type);
125 CheckWsdlQName (ctx, value, value.Element);
127 if (value.DefinedByElement && value.Element.Namespace == XmlSchema.Namespace)
128 ctx.ReportRuleViolation (value, BasicProfileRules.R2206);
130 if (value.Type != null && value.Type != XmlQualifiedName.Empty &&
131 value.Element != null && value.Element != XmlQualifiedName.Empty)
132 ctx.ReportRuleViolation (value, BasicProfileRules.R2306);
135 public override void Check (ConformanceCheckContext ctx, Types value)
139 public override void Check (ConformanceCheckContext ctx, Message value)
143 public override void Check (ConformanceCheckContext ctx, BindingCollection value) {
144 foreach (Binding b in value)
145 foreach (object ext in b.Extensions)
146 if (ext.GetType () == typeof (SoapBinding))
149 ctx.ReportRuleViolation (value, BasicProfileRules.R2401);
152 public override void Check (ConformanceCheckContext ctx, Binding value)
154 SoapBinding sb = (SoapBinding) value.Extensions.Find (typeof(SoapBinding));
158 if (sb.Transport == null || sb.Transport == "") {
159 ctx.ReportRuleViolation (value, BasicProfileRules.R2701);
163 if (sb.Transport != "http://schemas.xmlsoap.org/soap/http")
164 ctx.ReportRuleViolation (value, BasicProfileRules.R2702);
166 LiteralType type = GetLiteralBindingType (value);
167 if (type == LiteralType.NotLiteral)
168 ctx.ReportRuleViolation (value, BasicProfileRules.R2706);
169 else if (type == LiteralType.Inconsistent)
170 ctx.ReportRuleViolation (value, BasicProfileRules.R2705);
172 // Collect all parts referenced from this type
174 Hashtable parts = new Hashtable ();
175 PortType port = ctx.Services.GetPortType (value.Type);
176 foreach (Operation op in port.Operations) {
177 foreach (OperationMessage om in op.Messages) {
178 Message msg = ctx.Services.GetMessage (om.Message);
179 foreach (MessagePart part in msg.Parts)
180 parts [part] = part; // do not use Add() - there could be the same MessagePart instance.
184 foreach (OperationBinding ob in value.Operations) {
185 if (ob.Input != null) CheckMessageBinding (ctx, parts, ob.Input);
186 if (ob.Output != null) CheckMessageBinding (ctx, parts, ob.Output);
187 foreach (FaultBinding fb in ob.Faults)
188 CheckMessageBinding (ctx, parts, fb);
192 ctx.ReportRuleViolation (value, BasicProfileRules.R2209);
194 // check existence of corresponding operation in portType for each binding operation
195 if (CheckCorrespondingOperationsForBinding (ctx, value, port))
196 ctx.ReportRuleViolation (value, BasicProfileRules.R2718);
198 // check duplicate operation signature.
199 ArrayList sigs = new ArrayList ();
200 foreach (OperationBinding ob in value.Operations) {
201 if (sigs.Contains (ob.Name))
202 ctx.ReportRuleViolation (value, BasicProfileRules.R2710);
206 // check namespace declarations.
208 case LiteralType.Document:
209 case LiteralType.Rpc:
210 CheckSoapBindingExtensions (ctx, value, type);
215 bool CheckCorrespondingOperationsForBinding (ConformanceCheckContext ctx, Binding value, PortType port)
217 if (value.Operations.Count != port.Operations.Count)
219 foreach (OperationBinding b in value.Operations) {
220 Operation op = port.Operations.Find (b.Name);
226 msg = op.Messages.Input != null;
227 bind = b.Input != null;
231 msg = op.Messages.Output != null;
232 bind = b.Output != null;
236 foreach (FaultBinding fb in b.Faults)
237 if (op.Messages.Find (fb.Name) == null)
243 void CheckSoapBindingExtensions (ConformanceCheckContext ctx, Binding value, LiteralType type)
245 bool violationNS = false;
246 bool violation2717 = false;
247 bool violation2720 = false;
248 bool violation2721 = false;
250 foreach (OperationBinding op in value.Operations) {
251 SoapBodyBinding sbb = op.Extensions.Find (typeof (SoapBodyBinding)) as SoapBodyBinding;
253 if (type == LiteralType.Document && sbb.Namespace != null)
255 if (type == LiteralType.Rpc && sbb.Namespace == null)
256 violation2717 = true;
259 SoapHeaderBinding shb = op.Extensions.Find (typeof (SoapHeaderBinding)) as SoapHeaderBinding;
261 violationNS |= shb.Namespace != null;
262 violation2720 |= !IsValidPart (shb.Part);
265 SoapHeaderFaultBinding sfhb = op.Extensions.Find (typeof (SoapHeaderFaultBinding)) as SoapHeaderFaultBinding;
267 violationNS |= sfhb.Namespace != null;
268 violation2720 |= !IsValidPart (sfhb.Part);
271 SoapFaultBinding sfb = op.Extensions.Find (typeof (SoapFaultBinding)) as SoapFaultBinding;
273 violation2721 |= sfb.Name == null;
274 violationNS |= sfb.Namespace != null;
278 ctx.ReportRuleViolation (value,
279 type == LiteralType.Document ?
280 BasicProfileRules.R2716 :
281 BasicProfileRules.R2726);
283 ctx.ReportRuleViolation (value, BasicProfileRules.R2717);
285 ctx.ReportRuleViolation (value, BasicProfileRules.R2720);
287 ctx.ReportRuleViolation (value, BasicProfileRules.R2721);
290 bool IsValidPart (string part)
295 XmlConvert.VerifyNMTOKEN (part);
297 } catch (XmlException) {
302 public override void Check (ConformanceCheckContext ctx, OperationBinding value)
306 foreach (FaultBinding fb in value.Faults) {
307 SoapFaultBinding sfb = (SoapFaultBinding) value.Extensions.Find (typeof (SoapFaultBinding));
310 r2754 |= sfb.Name != fb.Name;
311 r2723 |= sfb.Use == SoapBindingUse.Encoded;
314 ctx.ReportRuleViolation (value, BasicProfileRules.R2754);
316 ctx.ReportRuleViolation (value, BasicProfileRules.R2723);
319 void CheckMessageBinding (ConformanceCheckContext ctx, Hashtable portParts, MessageBinding value)
321 SoapBodyBinding sbb = (SoapBodyBinding) value.Extensions.Find (typeof(SoapBodyBinding));
322 Message msg = FindMessage (ctx, value);
323 LiteralType bt = GetLiteralBindingType (value.OperationBinding.Binding);
327 if (bt == LiteralType.Document)
329 if (sbb.Parts != null && sbb.Parts.Length > 1)
330 ctx.ReportRuleViolation (value, BasicProfileRules.R2201);
332 if (sbb.Parts == null) {
333 if (msg.Parts != null && msg.Parts.Count > 1)
334 ctx.ReportRuleViolation (value, BasicProfileRules.R2210);
335 if (msg.Parts.Count == 1)
336 portParts.Remove (msg.Parts[0]);
339 if (sbb.Parts.Length == 0 && msg.Parts.Count == 1) {
340 portParts.Remove (msg.Parts[0]);
342 foreach (string part in sbb.Parts) {
343 MessagePart mp = msg.FindPartByName (part);
344 portParts.Remove (mp);
345 if (!mp.DefinedByElement)
346 ctx.ReportRuleViolation (value, BasicProfileRules.R2204);
351 else if (bt == LiteralType.Rpc)
353 if (sbb.Parts != null) {
354 foreach (string part in sbb.Parts) {
355 MessagePart mp = msg.FindPartByName (part);
356 portParts.Remove (mp);
357 if (!mp.DefinedByType)
358 ctx.ReportRuleViolation (value, BasicProfileRules.R2203);
364 SoapHeaderBinding shb = (SoapHeaderBinding) value.Extensions.Find (typeof(SoapHeaderBinding));
366 Message hm = ctx.Services.GetMessage (shb.Message);
367 MessagePart mp = hm.FindPartByName (shb.Part);
368 portParts.Remove (mp);
369 if (mp != null && !mp.DefinedByElement)
370 ctx.ReportRuleViolation (value, BasicProfileRules.R2205);
373 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) value.Extensions.Find (typeof(SoapHeaderFaultBinding));
375 Message hm = ctx.Services.GetMessage (shfb.Message);
376 MessagePart mp = hm.FindPartByName (shfb.Part);
377 portParts.Remove (mp);
378 if (mp != null && !mp.DefinedByElement)
379 ctx.ReportRuleViolation (value, BasicProfileRules.R2205);
382 // TODO: SoapFaultBinding ??
385 Message FindMessage (ConformanceCheckContext ctx, MessageBinding mb)
387 PortType pt = ctx.Services.GetPortType (mb.OperationBinding.Binding.Type);
388 foreach (Operation op in pt.Operations)
389 if (op.IsBoundBy (mb.OperationBinding)) {
391 if (mb is InputBinding) om = op.Messages.Input;
392 else if (mb is OutputBinding) om = op.Messages.Output;
393 else if (mb is FaultBinding) om = op.Faults [mb.Name];
396 return ctx.Services.GetMessage (om.Message);
403 public override void Check (ConformanceCheckContext ctx, Operation value)
405 switch (value.Messages.Flow) {
406 case OperationFlow.SolicitResponse:
407 case OperationFlow.Notification:
408 ctx.ReportRuleViolation (value, BasicProfileRules.R2303);
412 CheckR2305 (ctx, value);
415 void CheckR2305 (ConformanceCheckContext ctx, Operation value)
417 string [] order = value.ParameterOrder;
418 ServiceDescription sd = value.PortType.ServiceDescription;
419 Message omitted = null;
420 foreach (OperationMessage m in value.Messages) {
422 continue; // it is doubtful, but R2305 is not to check such cases anyways.
423 Message msg = sd.Messages [m.Name];
425 continue; // it is doubtful, but R2305 is not to check such cases anyways.
426 foreach (MessagePart p in msg.Parts) {
427 if (order != null && Array.IndexOf (order, p.Name) >= 0)
429 if (omitted == null) {
433 ctx.ReportRuleViolation (value, BasicProfileRules.R2305);
439 public override void Check (ConformanceCheckContext ctx, OperationMessage value) { }
440 public override void Check (ConformanceCheckContext ctx, Port value) { }
442 public override void Check (ConformanceCheckContext ctx, PortType value)
444 ArrayList names = new ArrayList ();
445 foreach (Operation o in value.Operations) {
446 if (names.Contains (o.Name))
447 ctx.ReportRuleViolation (value, BasicProfileRules.R2304);
453 public override void Check (ConformanceCheckContext ctx, Service value) { }
455 public override void Check (ConformanceCheckContext ctx, XmlSchema s)
457 if (s.TargetNamespace == null || s.TargetNamespace == "") {
458 foreach (XmlSchemaObject ob in s.Items)
459 if (!(ob is XmlSchemaImport) && !(ob is XmlSchemaAnnotation)) {
460 ctx.ReportRuleViolation (s, BasicProfileRules.R2105);
466 public override void Check (ConformanceCheckContext ctx, XmlSchemaImport value)
468 // LAMESPEC: same here to Check() for Import.
469 XmlSchema doc = ctx.GetDocument (value.SchemaLocation, value.Namespace) as XmlSchema;
470 if (doc == null) ctx.ReportError (value, "Schema '" + value.SchemaLocation + "' not found");
473 public override void Check (ConformanceCheckContext ctx, XmlSchemaAttribute value)
475 CheckSchemaQName (ctx, value, value.RefName);
476 CheckSchemaQName (ctx, value, value.SchemaTypeName);
478 XmlAttribute[] uatts = value.UnhandledAttributes;
480 foreach (XmlAttribute at in uatts)
481 if (at.LocalName == "arrayType" && at.NamespaceURI == "http://schemas.xmlsoap.org/wsdl/")
482 ctx.ReportRuleViolation (value, BasicProfileRules.R2111);
486 public override void Check (ConformanceCheckContext ctx, XmlSchemaAttributeGroupRef value)
488 CheckSchemaQName (ctx, value, value.RefName);
491 public override void Check (ConformanceCheckContext ctx, XmlSchemaComplexContentExtension value)
493 CheckSchemaQName (ctx, value, value.BaseTypeName);
494 if (value.BaseTypeName.Namespace == "http://schemas.xmlsoap.org/soap/encoding/" && value.BaseTypeName.Name == "Array")
495 ctx.ReportRuleViolation (value, BasicProfileRules.R2110);
498 public override void Check (ConformanceCheckContext ctx, XmlSchemaComplexContentRestriction value)
500 CheckSchemaQName (ctx, value, value.BaseTypeName);
501 if (value.BaseTypeName.Namespace == "http://schemas.xmlsoap.org/soap/encoding/" && value.BaseTypeName.Name == "Array")
502 ctx.ReportRuleViolation (value, BasicProfileRules.R2110);
505 public override void Check (ConformanceCheckContext ctx, XmlSchemaElement value)
507 CheckSchemaQName (ctx, value, value.RefName);
508 CheckSchemaQName (ctx, value, value.SubstitutionGroup);
509 CheckSchemaQName (ctx, value, value.SchemaTypeName);
510 if (value.Name != null && value.Name.StartsWith ("ArrayOf", StringComparison.Ordinal))
511 ctx.ReportRuleViolation (value, BasicProfileRules.R2112);
514 public override void Check (ConformanceCheckContext ctx, XmlSchemaGroupRef value)
516 CheckSchemaQName (ctx, value, value.RefName);
519 public override void Check (ConformanceCheckContext ctx, XmlSchemaKeyref value)
521 CheckSchemaQName (ctx, value, value.Refer);
524 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleContentExtension value)
526 CheckSchemaQName (ctx, value, value.BaseTypeName);
529 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleContentRestriction value)
531 CheckSchemaQName (ctx, value, value.BaseTypeName);
534 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeList value)
536 CheckSchemaQName (ctx, value, value.ItemTypeName);
539 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeRestriction value)
541 CheckSchemaQName (ctx, value, value.BaseTypeName);
544 public override void Check (ConformanceCheckContext ctx, XmlSchemaSimpleTypeUnion value)
546 if (value.MemberTypes != null) {
547 foreach (XmlQualifiedName name in value.MemberTypes)
548 CheckSchemaQName (ctx, value, name);
554 void CheckWsdlQName (ConformanceCheckContext ctx, object element, XmlQualifiedName name)
556 if (name == null || name == XmlQualifiedName.Empty) return;
557 if (name.Namespace == "" || name.Namespace == XmlSchema.Namespace) return;
559 if (ctx.ServiceDescription.Types != null && ctx.ServiceDescription.Types.Schemas != null)
561 foreach (XmlSchema s in ctx.ServiceDescription.Types.Schemas)
563 if (s.TargetNamespace == name.Namespace) return;
564 foreach (XmlSchemaObject i in s.Includes)
565 if ((i is XmlSchemaImport) && ((XmlSchemaImport)i).Namespace == name.Namespace) return;
568 ctx.ReportRuleViolation (element, BasicProfileRules.R2101);
571 void CheckSchemaQName (ConformanceCheckContext ctx, object element, XmlQualifiedName name)
573 if (name == null || name == XmlQualifiedName.Empty) return;
574 if (name.Namespace == "" || name.Namespace == XmlSchema.Namespace) return;
575 if (ctx.CurrentSchema.TargetNamespace == name.Namespace) return;
577 foreach (XmlSchemaObject i in ctx.CurrentSchema.Includes)
578 if ((i is XmlSchemaImport) && ((XmlSchemaImport)i).Namespace == name.Namespace) return;
580 ctx.ReportRuleViolation (element, BasicProfileRules.R2102);
583 LiteralType GetLiteralBindingType (Binding b)
585 SoapBinding sb = (SoapBinding) b.Extensions.Find (typeof(SoapBinding));
586 SoapBindingStyle style = (sb != null) ? sb.Style : SoapBindingStyle.Document;
587 if (style == SoapBindingStyle.Default) style = SoapBindingStyle.Document;
589 foreach (OperationBinding ob in b.Operations) {
590 SoapOperationBinding sob = (SoapOperationBinding) ob.Extensions.Find (typeof(SoapOperationBinding));
591 if (sob.Style != SoapBindingStyle.Default && sob.Style != style)
592 return LiteralType.Inconsistent;
593 if (ob.Input != null) {
594 SoapBodyBinding sbb = (SoapBodyBinding) ob.Input.Extensions.Find (typeof(SoapBodyBinding));
595 if (sbb != null && sbb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
596 SoapFaultBinding sfb = (SoapFaultBinding) ob.Input.Extensions.Find (typeof(SoapFaultBinding));
597 if (sfb != null && sfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
598 SoapHeaderBinding shb = (SoapHeaderBinding) ob.Input.Extensions.Find (typeof(SoapHeaderBinding));
599 if (shb != null && shb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
600 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) ob.Input.Extensions.Find (typeof(SoapHeaderFaultBinding));
601 if (shfb != null && shfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
603 if (ob.Output != null) {
604 SoapBodyBinding sbb = (SoapBodyBinding) ob.Output.Extensions.Find (typeof(SoapBodyBinding));
605 if (sbb != null && sbb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
606 SoapFaultBinding sfb = (SoapFaultBinding) ob.Input.Extensions.Find (typeof(SoapFaultBinding));
607 if (sfb != null && sfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
608 SoapHeaderBinding shb = (SoapHeaderBinding) ob.Input.Extensions.Find (typeof(SoapHeaderBinding));
609 if (shb != null && shb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
610 SoapHeaderFaultBinding shfb = (SoapHeaderFaultBinding) ob.Input.Extensions.Find (typeof(SoapHeaderFaultBinding));
611 if (shfb != null && shfb.Use != SoapBindingUse.Literal) return LiteralType.NotLiteral;
614 if (style == SoapBindingStyle.Document) return LiteralType.Document;
615 else return LiteralType.Rpc;
626 internal class BasicProfileRules
628 #region "Basic Profile 1.1 Section 4 (Service Description)"
630 // (BTW R1034 turned out to be a spec bug.)
632 // 4.1 Required Description
633 // Can't check: R0001
635 // 4.2 Document Structure
637 // R2028, R2029: schema conformance, depends on underlying XML
639 public static readonly ConformanceRule R2001 = new ConformanceRule (
641 "A DESCRIPTION MUST only use the WSDL \"import\" statement to import another WSDL description",
644 public static readonly ConformanceRule R2803 = new ConformanceRule (
646 "In a DESCRIPTION, the namespace attribute of the wsdl:import MUST NOT be a relative URI.",
649 public static readonly ConformanceRule R2002 = new ConformanceRule (
651 "To import XML Schema Definitions, a DESCRIPTION MUST use the XML Schema \"import\" statement",
654 // R2003: depends on ServiceDescription raw XML.
655 // R2004, R2009, R2010, R2011: requires schema resolution
656 // which depends on XmlResolver, while 1) XmlUrlResolver
657 // might not always be proper (e.g. network resolution) and
658 // 2) custom XmlResolver might resolve non-XML.
660 public static readonly ConformanceRule R2007 = new ConformanceRule (
662 "A DESCRIPTION MUST specify a non-empty location attribute on the wsdl:import element",
665 // R2008: denotes a possibility that cannot be verified.
667 // R2022, R2023, R4004: depends on underlying XML, which
668 // is impossible when ServiceDescription is already read
669 // (WebServiceInteroperability.CheckConformance() is the case).
671 public static readonly ConformanceRule R4005 = new ConformanceRule (
673 "A DESCRIPTION SHOULD NOT contain the namespace declaration xmlns:xml=\"http://www.w3.org/XML/1998/namespace\"",
676 // R4002, R4003: depends on underlying XML
678 public static readonly ConformanceRule R2005 = new ConformanceRule (
680 "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",
683 // R2030: is satisfied by API nature (DocumentableItem).
685 // R2025: cannot be checked.
687 public static readonly ConformanceRule R2026 = new ConformanceRule (
689 "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",
692 // R2027: is about the CONSUMER, cannot be checked.
696 public static readonly ConformanceRule R2101 = new ConformanceRule (
698 "A DESCRIPTION MUST NOT use QName references to elements in namespaces that have been neither imported, nor defined in the referring WSDL document",
701 public static readonly ConformanceRule R2102 = new ConformanceRule (
703 "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",
706 public static readonly ConformanceRule R2105 = new ConformanceRule (
708 "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)",
711 public static readonly ConformanceRule R2110 = new ConformanceRule (
713 "In a DESCRIPTION, array declarations MUST NOT extend or restrict the soapenc:Array type",
716 public static readonly ConformanceRule R2111 = new ConformanceRule (
718 "In a DESCRIPTION, array declarations MUST NOT use wsdl:arrayType attribute in the type declaration",
721 public static readonly ConformanceRule R2112 = new ConformanceRule (
723 "In a DESCRIPTION, elements SHOULD NOT be named using the convention ArrayOfXXX.",
726 // R2113: is about ENVELOPE.
728 // R2114: is satisfied by our processor.
732 public static readonly ConformanceRule R2201 = new ConformanceRule (
734 "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",
737 public static readonly ConformanceRule R2209 = new ConformanceRule (
739 "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",
742 public static readonly ConformanceRule R2210 = new ConformanceRule (
744 "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",
747 // R2202: Suggestion.
749 public static readonly ConformanceRule R2203 = new ConformanceRule (
751 "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",
754 // R2211: Related to ENVELOPE
755 // R2207: is about allowed condition (MAY).
757 public static readonly ConformanceRule R2204 = new ConformanceRule (
759 "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",
762 // R2208: is about allowed condition (MAY).
763 // R2212, R2213, R2214: related to ENVELOPE
765 public static readonly ConformanceRule R2205 = new ConformanceRule (
767 "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",
770 public static readonly ConformanceRule R2206 = new ConformanceRule (
772 "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",
777 // R2301: Related to ENVELOPE.
780 // btw it's not on Basic Profile TAD
781 public static readonly ConformanceRule R2303 = new ConformanceRule (
783 "A DESCRIPTION MUST NOT use Solicit-Response and Notification type operations in a wsdl:portType definition.",
786 public static readonly ConformanceRule R2304 = new ConformanceRule (
788 "A wsdl:portType in a DESCRIPTION MUST have operations with distinct values for their name attributes.",
791 public static readonly ConformanceRule R2305 = new ConformanceRule (
793 "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.",
796 public static readonly ConformanceRule R2306 = new ConformanceRule (
798 "A wsdl:message in a DESCRIPTION MUST NOT specify both type and element attributes on the same wsdl:part.",
803 public static readonly ConformanceRule R2401 = new ConformanceRule (
805 "A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP Binding as defined in WSDL 1.1 Section 3.",
810 public static readonly ConformanceRule R2701 = new ConformanceRule (
812 "The wsdl:binding element in a DESCRIPTION MUST be constructed so that its soapbind:binding child element specifies the transport attribute",
815 public static readonly ConformanceRule R2702 = new ConformanceRule (
817 "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\"",
820 public static readonly ConformanceRule R2705 = new ConformanceRule (
822 "A wsdl:binding in a DESCRIPTION MUST use either be a rpc-literal binding or a document-literal binding",
825 public static readonly ConformanceRule R2706 = new ConformanceRule (
827 "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",
830 // R2709: Suggestion.
832 public static readonly ConformanceRule R2710 = new ConformanceRule (
834 "The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.",
837 public static readonly ConformanceRule R2711 = new ConformanceRule (
839 "A DESCRIPTION SHOULD NOT have more than one wsdl:port with the same value for the location attribute of the soapbind:address element.",
842 // R2712: related to ENVELOPE.
843 // R2714: related to INSTANCE.
844 // R2750, R2727: related to CONSUMER.
846 public static readonly ConformanceRule R2716 = new ConformanceRule (
848 "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.",
851 public static readonly ConformanceRule R2717 = new ConformanceRule (
853 "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.",
856 public static readonly ConformanceRule R2726 = new ConformanceRule (
858 "An rpc-literal binding in a DESCRIPTION MUST NOT have the namespace attribute specified on contained soapbind:header, soapbind:headerfault and soapbind:fault elements.",
862 public static readonly ConformanceRule R2718 = new ConformanceRule (
864 "A wsdl:binding in a DESCRIPTION MUST have the same set of wsdl:operations as the wsdl:portType to which it refers.",
868 // R2719: is about allowed condition (MAY).
869 // R2740, R2741: no way to detect known faults here.
870 // R2742, R2743: related to ENVELOPE.
872 public static readonly ConformanceRule R2720 = new ConformanceRule (
874 "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.",
878 // R2749: is satisfied by API nature.
880 public static readonly ConformanceRule R2721 = new ConformanceRule (
882 "A wsdl:binding in a DESCRIPTION MUST have the name attribute specified on all contained soapbind:fault elements.",
885 public static readonly ConformanceRule R2754 = new ConformanceRule (
887 "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.",
890 // R2722: is about allowed condition (MAY).
892 public static readonly ConformanceRule R2723 = new ConformanceRule (
894 "f in a wsdl:binding in a DESCRIPTION the use attribute on a contained soapbind:fault element is present, its value MUST be \"literal\".",
897 // R2707: is satisfied by our implementation.
898 // R2724, R2725: related to INSTANCE.
899 // R2729, R2735: related to ENVELOPE.
900 // R2755: related to MESSAGE.
901 // R2737, R2738, R2739, R2753: related to ENVELOPE.
902 // R2751, R2752: related to ENVELOPE.
903 // R2744, R2745: related to MESSAGE.
904 // R2747, R2748: related to CONSUMER.
906 // 4.8 Use of XML Schema
908 // R2800: satisfied by API nature.
915 Below are the combination of these documents:
916 http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html
917 http://www.ws-i.org/Testing/Tools/2005/01/BP11_TAD_1-1.htm
919 TAD No. component recomm. WS-I Req.
920 BP2010 portType R2304
924 BP2014 operation R2305
925 BP2017 binding R2705,R2706
926 BP2018 definitions R2023,R2030
929 BP2021 binding R2720,R2749
932 BP2034 definitions rec. R1034,R4005
934 BP2101 definitions R2001
935 BP2103 definitions R2003
936 BP2104 definitions R2005
937 BP2105 definitions R2022,R2030
939 BP2108 types R2110,R2111
940 BP2110 types rec. R2112
944 BP2114 binding rec. R2209
952 BP2123 definitions rec. R2026