13

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

错误

命名空间“WindowsFormsApplication1.ServiceReference1”已包含“状态”C:\Trash\WindowsFormsApplication1\WindowsFormsApplication1\Service References\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(销售表头)的自定义页面

4

6 回答 6

8

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

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

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

假设没有服务器端问题:

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

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

  • 如果其他点没有解决问题(或者即使它们产生工作代码,它们对您也没有用),我接下来会尝试使用svcutil通过特定的序列化程序手动构建代理类。由于动态服务应该是 XML 服务,我会选择/serializer:XmlSerializer(编辑:我输入错误的命令行参数!)

该命令可能如下所示:

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

该工具的默认位置应%ProgramFiles%\Microsoft SDKs\Windows\v6.0\Bin根据该工具的MSDN 参考(框架 4.0 版)

于 2013-11-22T10:31:06.163 回答
6

这是为我解决的问题:

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

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

于 2015-08-25T13:14:29.813 回答
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 独有的

于 2014-02-09T15:52:56.393 回答
0

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

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

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

显然,这里的其他用户已经报告了

这符合你的情况吗?

于 2013-11-22T14:10:18.310 回答
0

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

于 2016-08-14T12:47:46.803 回答
0

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

这是我的故事...

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

在此处输入图像描述

不知何故,它完全被弄糊涂了,并创建了一个附加Reference1.cs的复制所有内容的附加Reference.cs文件(你可以看到它是一个新文件,因为 + 号)。

在此处输入图像描述

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

在此处输入图像描述

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

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

于 2016-09-22T20:30:29.707 回答