我正在为一个Java Web服务的.NET WCF客户端工作。我可以从Java Web服务WSDL成功生成.NET代理类,并通过代理类调用服务。一个问题是代理类中的类重复。假设我们有两个java Web服务: java_a 和 java_b ,它们都引用了一个类 common_class 。
现在,如果我在客户端为两个Java Web服务生成两个.NET代理类,请说: proxy_a 和 proxy_b 。现在,在两个代理类中都有一个名为 common_class 的类,一个是 proxy_a.common_class ,另一个是 proxy_b.common_class 。我想在客户端为两个代理类编写一些辅助类,但是很难处理common_class。我必须编写许多重复代码来操作两个common_class,这在我看来不应该发生。应该可以手动修改代理类来提取common_class,但由于我必须经常更新代理类,所以进行手动作业将非常痛苦。
所以我的问题是:如何在生成代理类时避免这种类定义重复?
祝你好运, - 布鲁斯
答案 0 :(得分:0)
您可以在物理上编辑一个类,并将其不是作为序数文件添加到项目中,而是作为文件的引用添加到两个项目中。不幸的是,你必须从这个文件中删除名称空间声明,否则2个代理也不会一起工作。
答案 1 :(得分:0)
您可以通过手动编辑.SvcMap文件来解决此问题。
为第一个Web服务创建代理类( proxy_a )。
然后转到Solution Explorer并确保选中“Show All Files”选项。
现在打开Reference.svcmap文件并搜索MetadataSources节点。
例如:
<MetadataSources>
<MetadataSource Address="http://www.example.com/proxy_a/mex"
Protocol="mex" SourceId="1" />
</MetadataSources>
只需将第二项服务的URL( proxy_b )添加到此节点即可。不要忘记增加SourceId属性。
<MetadataSources>
<MetadataSource Address="http://www.example.com/proxy_a/mex"
Protocol="mex" SourceId="1" />
<MetadataSource Address="http://www.example.com/proxy_b/mex"
Protocol="mex" SourceId="2" />
</MetadataSources>
右键单击服务引用,然后选择“更新服务引用”以重新生成客户端代码。现在,如果正确构建服务并将命名空间归因于需要的公司,那么将只为它们共享的公共类创建一种类型。
需要更多信息?我在一个月前左右写了一篇关于这个问题的文章:
http://cgeers.com/2011/07/31/wcf-sharing-types-using-svcmap/
希望它有所帮助。