我有两个使用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。可能涉及很多因素,或者可能非常简单。
答案 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成员。