10

我有两个使用 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 的原则”。我只是想摆脱这些该死的属性,因为在我正在做的事情的背景下,我绝对讨厌它们。

这两种服务之间肯定存在一些差异——但我不想完全拆开它们来找出差异。

之前的一个类似问题的答案是“你不能这样做”——这绝对不是真的,因为我有——我只是不知道我做了什么不同的事情。

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

4

5 回答 5

12

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

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

IsRequired=true将否定 testEnvFieldSpecified 属性的需要

于 2010-01-12T06:41:29.030 回答
3

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

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

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

希望这是有道理的。

于 2010-01-21T23:39:21.107 回答
0

好的,到目前为止,我发现了一件事会导致Specified生成属性:

  • 消息中存在一个XTypedElement

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

这触发Specified了在我的所有类中生成的所有属性:

    public XTypedElement Foo { get; set; }

然而这并没有:

    public XElement Foo { get; set; }

仍然很好奇为什么会这样,以及是否有任何其他事情触发了这一点。

于 2010-01-15T05:03:02.597 回答
0

注意:我意识到这是一个老问题。我在这里添加这个是因为这个问题在谷歌上是一个最高的结果,它对任何人来说都是有用的信息。

尝试将此行添加到您的操作合同声明中:
[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...*/
    }
}
于 2013-12-03T17:11:37.677 回答
0

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

于 2020-04-20T17:17:56.207 回答