添加服务引用为枚举和方法创建重复的定义

时间:2013-11-20 09:21:48

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

我在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(销售标题)的自定义页面

6 个答案:

答案 0 :(得分:8)

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

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

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

假设没有服务器端问题:

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

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

  • 如果其他要点没有解决问题(或者即使它们产生工作代码对它们没用),我接下来会尝试使用svcutil手动构建代理类通过特定的序列化器。由于Dynamics服务应该是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

答案 1 :(得分:5)

以下是为我解决的问题:

  1. 像往常一样添加服务引用
  2. 在&#34;解决方案资源管理器&#34;中,选择切换&#34;显示所有文件&#34;图标
  3. 打开刚刚添加的服务参考的Reference.svcmap
  4. 更改第<Serializer>Auto</Serializer>
  5. <Serializer>XmlSerializer</Serializer>
  6. 更新服务参考
  7. 似乎在某些版本的Visual Studio中,&#34;添加服务引用&#34;功能无法自动确定是否使用XmlSerializer og DataContractSerializer。所以上面强制它使用XmlSerializer。

答案 2 :(得分:2)

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

向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独有的

答案 3 :(得分:0)

之前我已经看到过这个问题,当我有一个WPF应用程序和一个WCF服务共享一个通用程序集作为在它们之间序列化/反序列化数据的方法时,它就发生了。

问题似乎是因为公共程序集的项目名称名称与不同。

这已经有一段时间了,所以我的记忆有些朦胧,但我相信我重命名了程序集以匹配项目名称,然后它工作正常。

显然,其他用户here已报告过。

这符合你的情况吗?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我建议始终将服务引用保留在自己的DLL中,以便更改撤消更改。 &#39; svcutil&#39;是老了&#39;现在有时会感到困惑。

这是我的故事......

我一直在为YEARS使用此服务参考,并且主要更新它而不用ussue。我需要Binary中的System.Data.Linq类型,所以我检查了该程序集。

enter image description here

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

enter image description here

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

enter image description here

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

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