我遇到与question类似的问题。我有多个Web服务,我正在使用WCF,它们都共享类型。服务本身是用Java编写的,我无法访问它们。共享类型具有相同的签名,但svcutil.exe
在运行时会出现此错误:
Error: There was a validation error on a schema generated during export:
Source:
Line: 8 Column: 3
Validation Error: The complexType 'http://MyServer.MyService:CommonType' has already been declared.
CommonType
在两个正在使用的Web服务中具有相同的签名。这是我打电话svcutil
的方式:
svcutil.exe /o:GeneratedServices.cs /n:*,MyNamespace.Generated http://MyServer.MyService1?WSDL http://MyServer.MyService2?WSDL
我知道wsdl.exe
有/mergeTypes
标志,适用于这些服务,但svcutil.exe
上有一些我真正想要使用的选项。我确实有人证明我可以使用,但是后端也使用.NET和WCF,而且我使用的Java后端也没有成功。
答案 0 :(得分:5)
首先 - 他们完全相同吗?特别是,SOAP名称空间必须匹配(除了其他所有内容)。如果他们不这样做,那么它们是不同的(不兼容的)类型;您将不得不使用2个不同的引用(在不同的C#名称空间中以避免冲突),并在两种类型之间移位数据。
如果类型 相同且仍然不起作用,那么您可以使用带有svcutil的/ r开关来使用现有程序集中的类型。尝试使用它一次以获取第一个类型(仅从1个URL) - 然后将该代码编译到程序集中。对第二个端点使用svcutil,并使用/ r标志标识您之前生成的程序集。
请注意;相关主题是为一种或多种类型编写partial class
- 例如,为类型本身提供转换方法/运算符。这可能会使事情变得更简单。例如,您可以在不同名称空间中的两个相似类型之间编写隐式(或显式)静态转换运算符。
答案 1 :(得分:0)
解答CAVEATS(和上下文)的答案: 不要忘记,svcutil.exe只是一个工具。您可以修改或扩展生成的代码 - 没有禁止它。虽然自定义生成的代码当然有缺点,但你应该只在睁大眼睛的情况下进行。
在早期,当通过Web服务将异构客户端和服务器组合在一起时,我经常使用修改生成的WSDL,修改从WSDL生成的代码(我在连接AXIS和.NET时编写了大量的sed脚本来交换命名空间),以及其他定制方法。一些已经存在时间最长的Web服务仍然需要这样。一个例子是MS Office Research Service,它根本不提供WSDL ......
另一种可能有效或无效的方法是通过部分类扩展生成的.NET代码。这是调整XML命名空间,添加可选元素(如版本字符串?)以及进行其他调整的好方法。当您重新生成代码时,您的扩展程序不会被覆盖。
编辑:从downvote来看,有些人认为这太冒险了!我完全理解。答案 2 :(得分:0)
由于它存在于两个服务中,因此在针对两个服务运行svcutil之后,您最终会得到两个声明。我不认为svcutil.exe足够聪明,可以重新归纳两种Web服务中都存在相同的类型。
您可能需要手动删除重复声明。如果它们真的相同,那么你应该能够修复它只使用其中一个并消除另一个。