2014-02-14 36 views
3

我需要访问基于Java的服务,该服务在与其导入的某个模式文件所使用的同一名称空间中定义portType元素。不幸的是,该模式包括与portType同名的complexType重命名服务部分参考

的问题是,“添加服务引用”使用portType的名称来创建服务合同的名称,并创建与complexType的名称class - 它在同一个命名空间.NET创建它们。这不行!

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


密切相关的一个问题是 - 有什么我可以做这个,如果portTypecomplexType处于不同的命名空间(如,恕我直言,他们应该)?

回答

-1

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

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

+0

你并不完全控制这些类。下次您执行“更新服务参考”时,它们将被覆盖。编辑生成的代码几乎总是一个坏主意。 –

1

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

更好的办法是将它们分成两个不同的命名空间,如你所建议的,这是行得通的。

最好的解决方案可能是修复java服务,如果可能的话,给两个冲突的项目赋予更多有意义的名称,这样服务更容易理解。

3

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

试图说服Java服务的维护者去除他们的界面中的歧义甚至是远程可能的吗?如果是的话,我建议竭尽全力地游说这一变化,因为你的选择,其余都不是很大的:

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

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

可能发挥与在.svcmap文件NamespaceMappings元素,但只允许你重命名一个完整的命名空间,该命名空间中不是个别的类型,这是一个令人失望。

可以手动创建的服务合同的接口(假设这是从portType生成的类型),然后使用ServiceContractMappings元件在.svcmap文件中使用这种类型的,而不是自动生成它。但是,当然你必须手动维护这个接口,这是一个无赖。 (这可能是最好的选择,IMO,如果你无法说服服务维护者改变他们的服务)。