如何在生成的代理中指定是否需要字段

时间:2009-01-18 08:56:57

标签: c# wcf web-services

WCF服务将DataContract中的多个元素公开为DataMember

[DataMember(IsRequired = true, EmitDefaultValue = false)]
public string Source;

[DataMember(IsRequired = true, EmitDefaultValue = false)]
public string Target;

在客户端生成的代理(通过在VS 2008中添加服务引用)中,客户端可以在Source或Target中传递null或空字符串。如何在客户端强制执行源和目标。即,在调用服务调用之前,如果Source或Target设置为null,则客户端应该获得异常。

4 个答案:

答案 0 :(得分:2)

您无法在客户端强制执行任何操作。考虑一下,客户端可以由您自定义开发,甚至可能不像.Net等.Net.IsRequired = true表示该类型必须通过线路序列化该成员,该值可能为空。

唯一的方法是,如果值为null并使用正确的错误合同,则从服务器抛出异常。

答案 1 :(得分:1)

嗯,null(xsi:nil)和空字符串都是值 - 它们不是你想要的值。

在反序列化期间(在客户端或服务器上):

您可以尝试在setter中添加一些代码来为无效值抛出异常吗?

或者(对于更复杂的情况),我认为数据协定支持反序列化回调,这应该允许您验证...

例如,您可以添加(在部分类中,如果需要,在客户端):

[OnDeserialized]
internal void OnDeserialized(StreamingContext context)
{
    if (string.IsNullOrEmpty(Bar))
    {
        throw new InvalidOperationException("No Bar!");
    }
}

对于预发送检查(在客户端),您必须添加额外的验证方法,或者可能(再次,在部分类中):

[OnSerializing]
internal void OnSerializing(StreamingContext context)
{
    if (string.IsNullOrEmpty(Bar))
    {
        throw new InvalidOperationException("No Bar!");
    }
}

但是,服务器必须也验证这一点 - 您不能认为它是发送邮件的您的客户端代码。

答案 2 :(得分:1)

IsRequired属性是指对线路上到达的数据进行的验证。如果您希望在客户端完成验证,则需要在客户端添加代码。

答案 3 :(得分:0)

您还可以查看验证应用程序块以及它如何集成到WCF中:

http://msdn.microsoft.com/en-us/library/cc309334.aspx