这是我的问题:在一个项目中,我必须使用3个第三方wcf服务 . 其中2个包含相同的对象和大致相同的方法 .
用户在应用程序中的角色决定了要使用的服务 . 例如:假设2个服务是ServiceRoleA和ServiceRoleB . 这两个服务都包含GetInfo()方法,最后返回InfoDetails对象 . InfoDetails对象具有两个服务的完全相同的签名 .
如果我只是为我的项目添加2个服务引用,我将获得ServiceRolaA.InfoDetails和ServiceRoleB.InfoDetails对象 . 相反,我只需要一个对象InfoDetails . 我只想写一个例程来处理InfoDetails等 .
我最初的想法是使用服务的datacontracts创建一个程序集,并在我的项目中引用程序集 . 这样,服务引用可以使用公共对象集 . 为此,我使用svcutil和wsdl创建了datacontract类,但是出错时出错 .
当我尝试以下内容时:
svcutil * .wsdl / dataContractOnly / n:*,DataContracts / language:C#/out:XxxData.cs
我收到以下错误:
“错误:在命名空间中键入'AuthenticationBase''http://schemas.datacontract.org/2004/07/xxx ' cannot be imported. It references ' KindOfModule ' from namespace ' http://schemas.datacontract.org/2004/07/yyy'但架构不包含适当的语句 . 更改架构以便类型可以映射到数据协定类型或使用ImportXmlType或使用其他序列化程序 .
如果您使用/ dataContractOnly选项导入数据协定类型并收到此错误消息,请考虑使用xsd.exe . 在服务 Contract 上应用XmlSerializerFormatAttribute属性后,可以在Windows Communication Foundation中使用xsd.exe生成的类型 . 或者,考虑使用/ importXmlTypes选项将这些类型作为XML类型导入,以与服务 Contract 中的DataContractFormatAttribute属性一起使用 . “
将datacontracts导出为XML类型对我来说是不可取的,所以接下来要尝试的是:
svcutil * .wsdl / dataContractOnly / n:*,DataContracts / serializer:XmlSerializer / language:C#/out:XxxData.cs
这导致了完全相同的错误 . 所以我决定尝试使用其他提到的选项来使用XSD.exe . 但由于我只有WSDL而且XSD.exe需要XSD文件,所以这也很麻烦 . 我还可以尝试更多选择吗?请帮忙!
1 回答
您无需添加服务引用或使用svcutil来创建客户端代理,这可以通过手动轻松完成 .
创建包含所有服务接口和数据协定的 Contract 程序集 .
从服务器和客户端引用该程序集(确保更新web.config和.svc文件以反映这些更改)
为您的服务创建客户端代理类 .
客户端代理就像添加类一样简单
唯一的缺点是您必须自己维护app.config文件中的
system.serviceModel
节点 .