代码之家  ›  专栏  ›  技术社区  ›  azheglov

如何为具有共享类型的多个WCF服务生成客户端代码

  •  11
  • azheglov  · 技术社区  · 15 年前

    我有多个WCF服务,它们共享一些数据契约,需要使用svcutil.exe生成客户端代码。我在使用两种最明显的方法时遇到了错误,需要一些帮助。

    [ServiceContract( Namespace = "http://www.me.com/services/" )]
    public interface IFooService {
        [OperationContract]
        Response RunFoo( Request request );
    }
    [ServiceContract( Namespace = "http://www.me.com/services/" )]
    public interface IBarService {
        [OperationContract]
        Response RunBar( Request request );
    }
    

    响应和请求在单独的程序集中定义:

    [DataContract( Namespace = "http://www.me.com/shared/" )]
    public class Request {
        [DataMember]
        public int Input { get; set; }
    }
    [DataContract( Namespace = "http://www.me.com/shared/" )]
    public class Response {
        [DataMember]
        public int Result { get; set; }
    }
    

    这些服务以一些简单的方式实现、编译、发布——现在让我们切换到客户端。

    svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc
    

    将导致大量关于重复数据类型的错误消息,从

    错误:导出过程中生成的架构出现验证错误: 资料来源: 行:1列:9087 验证错误:全局元素的 http://schemas.microsoft.com/2003/10/Serialization/:anyType "已经宣布,。

    错误:导出过程中生成的架构出现验证错误: 资料来源: 行:1列:12817 验证错误:complexType' http://www.me.com/shared/:Response

    为每个服务分别生成客户端文件可避免以下错误:

    svcutil /o:Foo.cs http://hostname.com/FooService.svc
    svcutil /o:Bar.cs http://hostname.com/BarService.svc
    

    所以 生成使用此类服务的客户端代码的常规方法是什么 ?

    限制:

    • 无法将包含共享类型的程序集发送到客户端(以便它们可以使用svcuti.exe的/r选项)
    5 回复  |  直到 15 年前
        1
  •  5
  •   marc_s HarisH Sharma    15 年前

    嗯,基本上你可以

    • 您必须分别为服务生成每个代理,每个服务将获得其自己的“请求”和“响应”类的“副本”

    可以 共享公共程序集-或与您共享 不能 -真的,我看不出还有其他选择。

        2
  •  4
  •   Marc Gravell    15 年前

    既然您已经排除了共享DTO程序集(为什么,顺便说一句?),在这种情况下,最简单的选项是 在不同的C#名称空间中生成类型(即两次调用 svcutil ),并在两者之间映射数据。本质上:将来自这两个服务的DTO视为巧合地相似。

    数据 名称空间等相同)。

        3
  •  2
  •   CJBrew    14 年前

    http://wscfblue.codeplex.com/

    它可以为每种类型生成单独的文件,并在后续操作中覆盖。

        4
  •  0
  •   Aditya    15 年前

    如果您遵守XXXXService类,则所有内容都在一个文件中。您可以将它们拆分为单独的IXXXService和XXXService文件以及datacontracts文件。

    然后,您可以为第二个服务运行该实用程序,并添加IXXXService1.cs和1XXXService.cs文件以及您可以用于共享这两个服务的相同数据契约。

    an example 你可以看到更多的例子 here 与MVC和WCF相关。

        5
  •  0
  •   FullStack-.NetMVC-BizMule-Dev    11 年前

    请从下面的链接下载WSCFblue-v1-Walkthrough-zip,它可能会帮助您实现。

    http://wscfblue.codeplex.com/releases/view/48529