【问题标题】:Why are there extra arguments in my wcf web service reference?为什么我的 wcf Web 服务参考中有额外的参数?
【发布时间】:2010-11-03 02:38:07
【问题描述】:

我正在尝试将 ASP.Net Web 服务转换为 WCF 应用程序。客户端位于不支持 WCF 的 .Net Compact Framework 上,因此我需要确保 WCF 继续支持 ASP 样式的 Web 服务。当我在 Visual Studio 中添加 Web 服务引用时,生成的代理类的方法有额外的参数。

例如,如果一个方法被定义为:

public void GetEmpInfo(int empNo)

该方法将在代理类中显示为:

public void GetEmpInfo(int empNo, bool empNoSpecified)

是什么原因造成的,我该如何让它停止?

【问题讨论】:

    标签: c# wcf web-services


    【解决方案1】:

    看看这个blog post ...

    这些额外的布尔值在哪里 “指定”成员来自什么 他们会吗?答案是架构 WCF 数据协定序列化程序 默认生成。由于 其版本控制模型的工作方式, 序列化程序生成所有数据成员 作为可选元素。较旧的网络 服务堆栈,ASP.NET Web 服务 (“ASMX”),使用不同的序列化程序, XmlSerializer,它维护 完整的模式和 XML 保真度。这 XmlSerializer 映射所有可选 两个成员的元素:一个 代表数据本身,一个 指定数据是否 实际存在——这是 “xxxSpecified”成员。这些 xxx指定的成员必须设置为 true 启用序列化 对应的“实际数据” 成员。

    【讨论】:

    • 仅供参考,在 .NET 3.5 中使用 Spring-WS 提供的 SOAP 1.2 WSDL 时也会涉及这些额外的方法。
    • @GlennBarnett 这就是我的情况。他们不得不将元素的 WSDL 信息从 xsd:int 更改为 xsd:integer。
    【解决方案2】:

    .NET Compact Framework 确实支持 WCF 的子集。您可以在MSDN 上查看此支持。看一下,它可能支持足以让您删除旧的 Web 服务支持。

    【讨论】:

      【解决方案3】:

      这发生在默认值不为 null 的类型上。在这些情况下,Web 服务无法知道参数是设置为默认值还是根本没有设置。

      您可以通过使用[XmlSerializerFormat] 属性装饰您的操作来摆脱额外的规范参数,例如:

          [OperationContract]
          [XmlSerializerFormat]
          string GetEmpInfo(int? empNo);
      

      这个属性也可以在类级别添加,这在大多数情况下都是有意义的。

      我知道您可以使用可空类型 (int?) 来处理这种情况,但我无法使用它来修复它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 2010-11-29
        相关资源
        最近更新 更多