我正在使用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序列化程序应该忽略任何私有成员。关于为什么会发生这种情况的任何想法?
答案 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创建服务器端存根吗?你还看到同样的问题吗?
马克