我在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(销售标题)的自定义页面
答案 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)
以下是为我解决的问题:
<Serializer>Auto</Serializer>
行<Serializer>XmlSerializer</Serializer>
似乎在某些版本的Visual Studio中,&#34;添加服务引用&#34;功能无法自动确定是否使用XmlSerializer og DataContractSerializer。所以上面强制它使用XmlSerializer。
答案 2 :(得分:2)
我知道这个问题已经过了一段时间,但以防万一其他人遇到类似的问题:
向VS项目添加ServiceReference时,使用与您已公开的Web服务相关的确切URL非常重要 - 即:
输入以下内容,不要发现所有Web服务对象:
然后从列表中选择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
类型,所以我检查了该程序集。
不知怎的,它完全混淆并创建了一个额外的Reference1.cs
,它在Reference.cs
中复制了所有内容(由于+,你可以看到它是一个新文件)。
即使我Undo pending changes
试图恢复它,额外的文件仍然没有+符号,但我仍然有重复。
我最终不得不完全删除引用并重新创建它。
正如我所说,为您的服务引用创建一个单独的项目/ DLL更加安全,因此当事情变得混乱(很少但确实发生)时,您可以更轻松地修复它。