如何使用WCF和EntLib验证块识别验证失败的记录?

时间:2009-09-08 11:43:15

标签: .net wcf validation enterprise-library

问题:

我有一个WCF Web服务,客户可以使用它来上传多个数据线。为了验证数据,我使用Enterprise Library Validation Block。记录可以嵌套多层。

问题:

如何识别验证失败的记录?

实施例

考虑以下数据结构。对于每个大陆,可以有多个国家,每个国家可以有多个城市。

    • 名称
    • 国家
      • 名称
        • 名称
        • 市长

当市长的确认失败时,我想知道哪个城市,国家和康泰特失败了。

2 个答案:

答案 0 :(得分:1)

我通过以下方式解决了我的问题:

在WCF集成中设置:

(Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF)

创建一个简单的标记属性:

public class ValidationKeyAttribute : Attribute
{
}

将放在标识数据记录的Property上。

创建一个界面:

public interface IValidationBackReference
{
    object BackReference { get; set; }
}

这是从上述示例中的城市记录到国家/地区记录的引用,以便链中的所有标识符也包括在内

修改BeforeCall()

中的ValidationParameterInspector方法

抓取所有输入并使用以下内容设置BackReference

private void SearchForBackReferences(object input, object backReference)
{
    if (input == null)
    {
        return;
    }
    Type t = input.GetType();
    if (t.IsArray)
    {
        Object[] inputs = (object[])input;
        SearchForBackReferences(inputs, backReference);
    }
    else if (input is IValidationBackReference)
    {
        foreach (PropertyInfo info in t.GetProperties())
        {
            object value = info.GetValue(input, null);
            SearchForBackReferences(value, input);
        }
        ((IValidationBackReference)input).BackReference = backReference;
    }
}

private void SearchForBackReferences(object[] inputs, object backReference)
{
    if(inputs==null)
    {
        return;
    }
    foreach (object input in inputs)
    {   
        SearchForBackReferences(input, backReference);
    }
}

修改CreateValidationDetail

中的ValidationParameterInspector方法

通过BackReferences使用类似的东西上传记录树

private static string FindKey(object target)
{
    StringBuilder result = new StringBuilder();
    if( target == null )
    {
        return result.ToString();
    }
    if(target is IValidationBackReference)
    {
        result.Append(FindKey(((IValidationBackReference) target).BackReference));
    }
    Type t = target.GetType();
    foreach (var info in t.GetProperties())
    {
        if (Attribute.IsDefined(info, typeof(ValidationKeyAttribute)))
        {
            object objectValue = info.GetValue(target, null);
            string stringValue = "(null)";
            if (objectValue != null)
            {
                stringValue = objectValue.ToString();
            }
            result.Append(string.Format("{0} = '{1}'; ",info.Name, stringValue));
        }
    }
    return result.ToString();
}

并将其放入Details.Key的{​​{1}}。到目前为止,安装程序。


在Webservice

现在要做的就是在Webservice使用的类上实现ValidationKDetail接口,并将IValidationBackReference属性放在适当的属性上。

上面的示例如下所示:

[ValidationKey]

多么怪物......

答案 1 :(得分:0)

我认为您可能需要编写自己的验证程序,其中包含备份对象树并生成合适的验证错误消息所需的逻辑。请查看本文以获取更多信息:

http://www.codeproject.com/KB/cs/VABCustomValidator.aspx