重命名服务参考的部分

时间:2014-02-14 02:41:05

标签: c# wcf wsdl wcf-client

我需要访问基于Java的服务,该服务在其导入的一个模式文件所使用的相同名称空间中定义portType元素。不幸的是,该架构包含complexType,其名称与portType

相同

问题是“添加服务引用”使用portType的名称来创建服务合同的名称,并创建名为class的{​​{1}} - 它在同一个.NET命名空间中创建它们。这不起作用!

我可以在“添加服务引用”对话框或.svcmap文件中“重命名”服务合同类型吗?


一个密切相关的问题是 - 如果complexTypeportType位于不同的名称空间中,我可以做些什么(因为,恕我直言,他们应该) ?

3 个答案:

答案 0 :(得分:3)

不幸的是,我认为简短的答案是“不”。

是否可以尝试说服Java服务的维护者从其界面中消除歧义?如果是这样,我建议尽可能努力地为这一变化进行游说,因为其他选择并不是那么好:

可以尝试使用.svcmap文件中的ExcludedTypes元素来强制服务引用不生成与complexType冲突的portType。如果你真的需要使用那个complexType,你需要手动实现它,这是一个无赖。

可以手动编辑Reference.cs文件,以更改其中一种冲突类型的名称,正如其他人所建议的那样。但是每个维护代码的人都需要记住每次重新生成服务引用时都要执行此手动编辑,这是一个无赖。

可以使用.svcmap文件中的NamespaceMappings元素,但它只允许您重命名整个命名空间,而不是该命名空间中的单个类型,这是一个无赖。

可以手动创建服务合约接口(假设这是从portType生成的类型),然后使用中的ServiceContractMappings元素。 svcmap文件使用该类型而不是自动生成它。但当然你必须手动维护该界面,这是一个无赖。 (这可能是最好的选择,IMO,如果您无法说服服务维护人员更改其服务)。

答案 1 :(得分:1)

您可以像dustinmorris所建议的那样编辑生成的类。但是,如果您需要更新服务引用,则会出现问题,因为它会重新生成这些类。

最好将它们分成两个不同的命名空间,如你所说,这样可行。

最好的解决方案可能是尽可能修复java服务,并为两个冲突的项目提供更有意义的名称,以便更容易理解服务。

答案 2 :(得分:-1)

在Visual Studio中,您可以在解决方案资源管理器中选择项目,在顶部您可以使用一小组图标。从右侧悬停鼠标悬停在它们上面,你会发现一个名为"显示所有文件"。这将显示隐藏文件,例如由服务引用创建的类(现在您应该使用箭头来扩展它)。

您可以完全控制这些类。您可以重命名它们,将它们放在不同的命名空间中等等。