wsdl.exe生成的WCF服务公开wsdl中的私有字段

时间:2009-10-21 17:02:34

标签: c# .net wcf wsdl

我正在使用WCF在C#中进行一些wsdl和客户端优先开发(wsdl和客户端已经存在,我正在构建服务器端),而且我遇到了一个奇怪的问题。我使用wsdl.exe从我的.wsdl生成合同,我能够构建它并将WCF服务作为Windows服务托管。

然而,我从http://localhost/Service?wsdl获得的wsdl暴露私有字段而不是公共属性(例如:而不是OsType我得到m_OsTypeField,这是与公众关联的私有变量OsType属性。)

以下是其中一个有此问题的类的属性: [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://xxxxxxx.com/")]

我完全难倒,因为.NET XML序列化程序应该忽略任何私有成员。关于为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:4)

您的datacontracts正在使用XmlSerializer引擎,但您的OperationContract正在使用DataContractSerializer。

在操作合同中应用XmlSerializerFormatAttribute

来自MSDN http://msdn.microsoft.com/en-us/library/ms732038(v=VS.90).aspx

有时,DataContractSerializer不足以序列化您的类型。 WCF支持备用序列化引擎XmlSerializer,您也可以使用它来序列化参数。 XmlSerializer允许您使用诸如XmlAttributeAttribute之类的属性对结果XML进行更多控制。要切换到将XmlSerializer用于特定操作或整个服务,请将XmlSerializerFormatAttribute属性应用于操作或服务。例如:

[ServiceContract] 
public interface IAirfareQuoteService
{
    [OperationContract]
    [XmlSerializerFormat]
    float GetAirfare(Itinerary itinerary, DateTime date);
}

有关更多信息,请参阅使用XmlSerializer类。请记住,建议不要手动切换到此处所示的XmlSerializer,除非您有特定的理由这样做,如该主题中所述。

答案 1 :(得分:2)

如果您使用的是WCF,则不应使用wsdl.exe,而应使用svcutil.exe

此外,标准WCF DataContract序列化程序将很乐意序列化您使用[DataMember]属性标记的任何内容 - 实际上.NET可见性设置与数据的SOA视图无关。

但是,从您的代码示例中看起来好像您使用的是Xml Serializer而不是DataContractSerializer - 可能是因为您使用了wsdl.exe而不是svcutil.exe。

您可以尝试使用svcutil.exe创建服务器端存根吗?你还看到同样的问题吗?

马克