【问题标题】:wsdl.exe-generated WCF service exposing private fields in wsdlwsdl.exe 生成的 WCF 服务在 wsdl 中公开私有字段
【发布时间】:2009-10-21 17:02:33
【问题描述】:

我正在使用 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 序列化程序应该忽略任何私有成员。关于为什么会发生这种情况的任何想法?

【问题讨论】:

    标签: c# .net wcf wsdl


    【解决方案1】:

    您的数据合同正在使用 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,除非您有特定的理由这样做,如该主题中所述。

    【讨论】:

      【解决方案2】:

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

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

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

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

      马克

      【讨论】:

      • 使用带有 DataContractSerializer 的 SvcUtil.exe 生成的接口包含 void、无参数的方法(这些方法应接受请求类型并返回响应类型。)除此之外,不生成任何数据类型.我是否缺少 SvcUtil 的某些内容?另外,不确定这是否重要:如果我将 /ser 选项设置为“auto”,则使用 XmlSerializer。
      • 更新:我得到了 SvcUtil.exe 生成的代码来工作并发布正确的 wsdl。但是有几个问题:1)如果不用于 WCF,wsdl.exe 打算用于什么? 2) 我在使用 DataContractSerializer 时 SvcUtil.exe 做错了什么?
      • wsdl.exe 被用于“旧式”ASMX Web 服务——这是 .NET 1.x/2.x 技术——几乎上个世纪 ;-)
      • 不确定 DataContractSerializer - 它是默认值,应该使用,但有某些条件(我猜你的 wsdl 显然有其中之一)使 WCF 无法使用 DataContractSerializer (如 XML 消息中的属性),然后它会切换到使用 XmlSerializer。
      • 一篇关于 SvcUtil 使用 XmlSerializer 而不是 DataContractSerializer 的好帖子:webservices20.blogspot.com/2008/10/…
      猜你喜欢
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2013-08-21
      相关资源
      最近更新 更多