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

olt*_*man 2 .net c# wcf wsdl

我正在使用 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,除非您有该主题中详述的特定原因这样做。