这是我的问题:在一个项目中,我必须使用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
我收到以下错误:
“错误:无法导入名称空间”http://schemas.datacontract.org/2004/07/xxx“中的”AuthenticationBase“。它从名称空间”http://schemas.datacontract.org/2004/07/yyy“引用”KindOfModule“,但架构不包含适当的语句。要么更改架构,请类型可以映射到数据协定类型或使用ImportXmlType或使用不同的序列化程序。
如果您使用/ dataContractOnly选项导入数据协定类型并收到此错误消息,请考虑使用xsd.exe。在服务合同上应用XmlSerializerFormatAttribute属性后,可以在Windows Communication Foundation中使用xsd.exe生成的类型。或者,考虑使用/ importXmlTypes选项将这些类型作为XML类型导入,以与服务契约中的DataContractFormatAttribute属性一起使用。“
将数据交换作为XML类型导出对我来说是不可取的,所以接下来要尝试的是:
svcutil * .wsdl / dataContractOnly / n:*,DataContracts / serializer:XmlSerializer / language:C#/out:XxxData.cs
导致完全相同的错误。所以我决定尝试使用其他提到的选项来使用XSD.exe。但由于我只有WSDL而且XSD.exe需要XSD文件,所以这也是工作。我还可以尝试更多选择吗?请帮忙!
答案 0 :(得分:0)
您无需添加服务引用或使用svcutil来创建客户端代理,这很容易手工完成。
客户端代理就像添加类
一样简单public class ServiceRoleAClient : ClientBase<IServiceRoleA>, IServiceRoleA
{
public InfoDetails GetInfo(GetInfoRequest request)
{
return Channel.GetInfo(request);
}
}
唯一的缺点是您必须自己维护app.config文件中的system.serviceModel
节点。