如何防止在WCF客户端中生成“指定”属性?

时间:2010-01-12 02:00:20

标签: wcf silverlight wcf-proxy

我有两个使用VS2008构建的.NET 3.5 WCF服务。

我在Silverlight中有两个WCF客户端来使用这些服务。使用“添加服务引用”生成客户端。我正在使用Silverlight 4。

使用每个属性的Specified属性生成其中一个代理。这是我的服务方法的“消息输入”类:

    // properties are generated for each of these fields
    private long customerProfileIdField;        
    private bool customerProfileIdFieldSpecified;        
    private bool testEnvField;        
    private bool testEnvFieldSpecified;

现在我的其他服务(仍然使用Silverlight客户端)不会生成Specified属性。

现在我不关心'良好SOA的原则'。我只想摆脱这些该死的属性,因为在我正在做的事情中我绝对讨厌它们。

两种服务之间必须有一些区别 - 但我不想完全撕掉它们以找出差异。

similar question之前有一个答案'you cant do it' - 这绝对不是真的,因为我有 - 我只是不知道我做了什么不同。

编辑:我现在处于这样一种情况:我将Silverlight 4代理重新生成到我的3.5 WCF服务(全部在同一个localhost机器上),有时候我会获得“指定”属性,有时我却没有。我不再认为(我最初怀疑)这仅仅是由于某些端点配置或服务级别[属性]。消息本身中的某些触发器会导致生成(或不生成)Specified。可能涉及很多因素,或者可能非常简单。

5 个答案:

答案 0 :(得分:11)

在声明属性的WCF服务中尝试此操作

[DataMember(IsRequired=true)]
public bool testEnvField { get; set; }

IsRequired=true将否定对testEnvFieldSpecified属性的需求

答案 1 :(得分:2)

为值类型生成这些额外的Specified属性,这些值在合同或属性标记中被指定为可选。

由于值类型默认具有值,因此为这些属性添加了额外的Specified标志,以允许客户端(和服务器)区分明确未指定或明确指定的内容 - 这可能是设置为默认值。没有它,即使你没有在客户端代码中设置它们(因为映射到int),整数总是最终为0(并被序列化)。因此,当您这样做时,还需要确保将Specified标志设置为true,否则这些属性将不会被序列化。

因此,为了防止为值类型生成这些标志,您必须更改合同以使这些值类型属性成为必需属性,而不是可选。

希望这是有道理的。

答案 2 :(得分:0)

好的,到目前为止,我发现了一件可以生成Specified属性的内容:

  • 邮件中存在XTypedElement

这些由Linq2XSD使用。我从Linq2XSD模型中返回了一个元素。

这个触发Specified属性将在我的所有类中生成一切:

    public XTypedElement Foo { get; set; }
然而,这并没有:

    public XElement Foo { get; set; }

仍然很好奇为什么会这样,如果还有其他事情触发这个。

答案 3 :(得分:0)

注意:我意识到这是一个老问题。我在这里添加此内容是因为这个问题在Google上显示为最佳结果,无论是谁来看都是有用的信息。

尝试将此行添加到您的操作合同声明中:
[XmlSerializerFormat]

看起来应该是这样的:

namespace WebServiceContract
{
    [ServiceContract(Namespace = "http://namespace")]
    [XmlSerializerFormat] //This line here will cause it to serialize the "optional" parameters correctly, and not generate the extra
    interface InterfaceName
    {
        /*...Your web service stuff here...*/
    }
}

答案 4 :(得分:0)

我发现,如果将DataTable放在服务DataContract中,则生成的客户端将使用xml序列化程序,从而生成* IsSpecified成员。