/// <summary> /// Verify the code rule /// </summary> /// <param name="context">Service context</param> /// <param name="info">out paramater to return violation information when rule fail</param> /// <returns>true if rule passes; false otherwise</returns> public override bool?Verify(ServiceContext context, out ExtensionRuleViolationInfo info) { if (context == null) { throw new ArgumentNullException("context"); } bool?passed = null; info = null; var edmxHelper = new EdmxHelper(XElement.Parse(context.MetadataDocument)); var segments = ResourcePathHelper.GetPathSegments(context); UriType uriType; var target = edmxHelper.GetTargetType(segments, out uriType); if (uriType == UriType.URI3) { XElement meta = XElement.Parse(context.MetadataDocument); string targetType = ((EdmProperty)target).TypeUsage.EdmType.FullName; var complexType = ResourcePathHelper.GetComplexType(targetType, meta); if (complexType != null) { XElement payload = XElement.Parse(context.ResponsePayload); string schema = GetRngSchema(ResourcePathHelper.GetBaseName(targetType), payload.Name.NamespaceName); RngVerifier verifier = new RngVerifier(schema); TestResult result; passed = verifier.Verify(context, out result); if (passed.HasValue && !passed.Value) { info = new ExtensionRuleViolationInfo(this.ErrorMessage, context.Destination, context.ResponsePayload, result.LineNumberInError); } } } return(passed); }