【问题标题】:adding a service reference create duplicated definitions for enums and methods添加服务引用为枚举和方法创建重复的定义
【发布时间】:2013-11-20 09:21:47
【问题描述】:

我正在使用 Visual Studio 2010 中的 Add Service Reference 功能将 Navision Web 服务添加到一个简单的 Windows 窗体应用程序中,生成了引用,但在代码中存在阻止代码编译的重复定义,例如:

错误

命名空间“WindowsFormsApplication1.ServiceReference1”已经 包含一个定义 '状态' C:\Trash\WindowsFormsApplication1\WindowsFormsApplication1\Service 参考\ServiceReference1\Reference.cs

Reference.cs里面我有

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1015")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:microsoft-dynamics-schemas/page/salesheaderpage")]
public enum Status {

    /// <remarks/>
    Open,

    /// <remarks/>
    Released,

    /// <remarks/>
    Pending_Approval,

    /// <remarks/>
    Pending_Prepayment,
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="Status", Namespace="urn:microsoft-dynamics-schemas/page/salesheaderpage")]
public enum Status : int {

    [System.Runtime.Serialization.EnumMemberAttribute()]
    Open = 0,

    [System.Runtime.Serialization.EnumMemberAttribute()]
    Released = 1,

    [System.Runtime.Serialization.EnumMemberAttribute()]
    Pending_Approval = 2,

    [System.Runtime.Serialization.EnumMemberAttribute()]
    Pending_Prepayment = 3,
}

我已经尝试取消选中Reuse types in referenced assemblies,但在这两种情况下仍然会生成重复的定义。

有什么想法吗?

编辑:页面是连接到标准表 36(销售表头)的自定义页面

【问题讨论】:

  • 哪个版本的导航? 2009 年还是 2013 年?
  • 版本为2009 R2
  • 我相信需要更多信息。试图重现它,不能。我的 VS2010 仅生成该字段的第一个版本(名称为 Open、Release 等的版本)。您发布的页面可能有问题。我已经在第 42 页上对其进行了测试,该页基于与您相同的销售页眉。
  • @MakSim 非常感谢您的测试,表格是销售标题 (36),但页面是自定义页面(由于集成,无法使用标准页面),但是发布到 WEB 服务的其他页面的枚举也会发生此错误(表格 810)
  • 这里有一个关于这个问题的大线程:social.msdn.microsoft.com/Forums/en-US/…。但要点是您的服务提供了格式错误的 wsdl,并且添加服务引用默默地从 DataContract 序列化回退到 XML 序列化,这会弄乱生成的类。使用带有/serializer:DataContractSerializer 选项的svcutil,它会告诉你你的wsdl 有什么问题。

标签: c# visual-studio-2010 wcf dynamics-nav navision


【解决方案1】:

问题似乎是序列化发生了两次:

//Xml Serializer
[System.Xml.Serialization.XmlTypeAttribute(...

//DataContract Serializer
[System.Runtime.Serialization.DataContractAttribute(...

假设没有服务器端问题:

  • 首先要检查的是您在本地没有任何同名的枚举,因为它经常会破坏类型重用。

  • 另外,使用Add Web Reference 应该提供工作代码。

  • 1234563特定的序列化程序。由于动态服务应该是 XML 服务,我会选择 /serializer:XmlSerializer(编辑:我输入错误的命令行参数!)

命令可能如下所示:

svcutil <ServiceURL> /Language:CS /target:Code 
/out:MyServiceProxy.cs /config:MyServiceProxy.config /serializer:XmlSerializer

根据MSDN Reference for the tool (Framework ver 4.0),工具的默认位置应为%ProgramFiles%\Microsoft SDKs\Windows\v6.0\Bin

【讨论】:

  • 嗨@Alex,感谢您的回复。 1)没有其他枚举,我启动了一个空项目以避免这些问题 2)Web 参考创建工作代码,但我需要使用服务参考中的这些 WS 3)我将尝试使用 svcutil 创建代理,你能请提供一个完整的命令行作为示例?非常感谢
  • 我扩展了答案
  • 用你的解决方法(使用 svcutil)我解决了我的问题,现在我可以拥有一个没有重复定义的代理(需要修复命名空间和 app.config,但都是小事)。因为问题是为什么标准服务参考会生成重复项,所以我会在 7 天内保持开放问题以获得可能的答案,但如果没有其他答案出现,我会将您设置为已接受并给您赏金。再次感谢您!
【解决方案2】:

这是为我解决的问题:

  1. 照常添加服务引用
  2. 在“解决方案资源管理器”中,选择切换“显示所有文件”图标
  3. 打开刚刚添加的服务引用的 Reference.svcmap
  4. 换行&lt;Serializer&gt;Auto&lt;/Serializer&gt;
  5. &lt;Serializer&gt;XmlSerializer&lt;/Serializer&gt;
  6. 更新服务参考

似乎在某些版本的 Visual Studio 中,“添加服务引用”功能无法自动确定是否使用 XmlSerializer 和 DataContractSerializer。所以上面强制它使用 XmlSerializer。

【讨论】:

  • 感谢您的回答。我不知道什么时候可以尝试您的解决方案,但我会发布我的结果。
  • 甜蜜!感谢您的回答。我正在将旧项目迁移到 vs2015 并遇到大量错误。这个答案解决了我所有的问题。
  • 效果很好。很棒的建议!
【解决方案3】:

我知道这个问题已经有一段时间了,但以防万一其他人遇到类似问题:

向您的 VS 项目添加 ServiceReference 时,使用与您公开的 Web 服务相关的确切 url 很重要——即:

不要通过输入发现所有 Web 服务对象:

http://navserver.domain.com:7047/DynamicsNAV/WS/services

然后从列表中选择 Web 服务对象。

改为专门引用 Web 服务对象,如下所示:

http://navserver.domain.com:7047/DynamicsNAV/WS/%PercentEncodedCompanyNameHere%/page/salesheaderpage

这样可以省去删除多余引用的麻烦。

向您的项目添加 Web 引用时,这不是问题,它是 ServiceReferences 独有的

【讨论】:

    【解决方案4】:

    我以前见过这个问题,当我有一个 WPF 应用程序和一个 WCF 服务共享一个公共程序集作为它们之间的序列化/反序列化数据的一种方式时,它就发生了。

    问题似乎是由于公共程序集的名称与其项目名称不同。

    这是很久以前的事了,所以我的记忆有些模糊,但我相信我重命名了程序集以匹配项目名称,然后它运行良好。

    显然已经被其他用户here举报了。

    这符合你的情况吗?

    【讨论】:

      【解决方案5】:

      这可能对某人有帮助。我正在将 postcodeanywhere 服务添加到应用程序并不断收到相同类型的错误。我将 IIS 应用程序池更改为允许 32 位,它立即开始工作。我不知道为什么会这样,但它对我有用。

      【讨论】:

        【解决方案6】:

        我建议始终将服务引用保存在自己的 DLL 中,以便更容易撤消更改。 “svcutil”现在“旧”了,有时会混淆。

        这是我的故事...

        多年来,我一直在使用此服务参考,并且大部分时间都在更新它而没有使用。我需要System.Data.Linq 中的Binary 类型,所以我检查了那个程序集。

        不知何故,它完全混淆并创建了一个额外的 Reference1.cs,它复制了 Reference.cs 中的所有内容(您可以看到它是一个新文件,因为 +)。

        即使我使用Undo pending changes 尝试还原它,额外的文件仍然没有 + 符号,但我仍然有重复。

        我最终不得不完全删除引用并重新创建它。

        正如我所说,为您的服务引用创建一个单独的项目/DLL 会更安全,因此当事情变得混乱(罕见但确实发生)时,您可以更轻松地修复它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-07
          • 1970-01-01
          • 2011-04-27
          • 2018-09-16
          • 1970-01-01
          • 2013-11-06
          相关资源
          最近更新 更多