我正在使用 WCF 在 C# 中进行一些 wsdl 和客户端优先开发(wsdl 和客户端已经存在,我正在构建服务器端,)并且我遇到了一个奇怪的问题。我使用 wsdl.exe 从我的 .wsdl 生成合同,我能够构建它并将 WCF 服务作为 Windows 服务托管。
但是,我从http://localhost/Service?wsdl 获得的 wsdl公开了私有字段而不是公共属性(例如:而不是OsTypeI get 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 序列化程序应该忽略任何私有成员。关于为什么会发生这种情况的任何想法?
小智 6
您的数据合同正在使用 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);
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅使用 XmlSerializer 类。请记住,不建议手动切换到此处所示的 XmlSerializer,除非您有该主题中详述的特定原因这样做。