使用WCF服务的数据交换创建程序集

时间:2014-01-30 08:55:18

标签: c# wcf wsdl svcutil.exe xsd.exe

这是我的问题:在一个项目中,我必须使用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文件,所以这也是工作。我还可以尝试更多选择吗?请帮忙!

1 个答案:

答案 0 :(得分:0)

您无需添加服务引用或使用svcutil来创建客户端代理,这很容易手工完成。

  1. 创建包含所有服务接口和数据协定的合同程序集。
  2. 从服务器和客户端引用该程序集(确保更新web.config和.svc文件以反映这些更改)
  3. 为您的服务创建客户端代理类。
  4. 客户端代理就像添加类

    一样简单
    public class ServiceRoleAClient : ClientBase<IServiceRoleA>, IServiceRoleA
    {
       public InfoDetails GetInfo(GetInfoRequest request)
       {
          return Channel.GetInfo(request);
       }
    }
    

    唯一的缺点是您必须自己维护app.config文件中的system.serviceModel节点。