首页 文章

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

提问于
浏览
0

这是我的问题:在一个项目中,我必须使用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 回答

  • 0

    您无需添加服务引用或使用svcutil来创建客户端代理,这可以通过手动轻松完成 .

    • 创建包含所有服务接口和数据协定的 Contract 程序集 .

    • 从服务器和客户端引用该程序集(确保更新web.config和.svc文件以反映这些更改)

    • 为您的服务创建客户端代理类 .

    客户端代理就像添加类一样简单

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

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

相关问题