我有两个使用VS2008构建的.NET 3.5 WCF服务。
我在Silverlight中有两个WCF客户端来使用这些服务。客户端由“添加服务参考”生成。我正在使用Silverlight 4。
其中一个代理是使用每个属性的Specified
个属性生成的。这是我的服务方法的'message-in'类:
// 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服务(都在同一台本地主机上)的情况下,有时我会获得“指定”属性,而有时却没有。我不再认为(正如我最初怀疑的那样)这完全是由于某些端点配置或服务级别[属性]。消息本身中存在某些触发器,这些触发器会导致生成(或不生成)Specified。可能涉及很多因素,或者可能很简单。
在声明该属性的WCF服务中尝试此操作
[DataMember(IsRequired=true)]
public bool testEnvField { get; set; }
IsRequired=true
将取消对testEnvFieldSpecified属性的需要
这些额外的指定属性是为在合同或属性标记中指定为可选的值类型生成的。
由于值类型默认情况下具有值,因此将为这些属性添加额外的Specified
标志,以允许客户端(和服务器)区分未明确指定或未明确指定的内容-可以将其设置为默认值。没有它,即使您没有在客户端代码中设置整数(由于映射到int),整数也总是以0(并被序列化)结尾。因此,当您这样做时,还需要确保将Specified
标志设置为true,否则这些属性将不会被序列化。
因此,为了防止为值类型生成这些标志,您必须更改合同以使这些值类型属性成为强制性的,而不是可选的。
希望如此。
确定,到目前为止我发现了一件事,将导致生成Specified
属性:
XTypedElement
。 这些由Linq2XSD使用。我从Linq2XSD模型返回了一个元素。
此触发的Specified
属性将在我所有的课程中全部生成:
public XTypedElement Foo { get; set; }
但是这不是:
public XElement Foo { get; set; }
仍然对这是为什么感到好奇,以及是否还有其他东西触发此。
注意:我意识到这是一个老问题。我在此处添加此内容是因为该问题在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...*/
}
}
[我发现,如果我将DataTable放在服务DataContract中,则生成的客户端将使用xml序列化程序,并因此生成* IsSpecified成员。