wsdl.exe / svcutil.exe - 有没有办法在Web服务或客户端生成期间不为xsds中的类型生成类

时间:2010-02-16 17:02:10

标签: c# wsdl.exe svcutil.exe

我们有一个集中管理的对象模型,用于C#中的模式中的类型。 我们希望整个企业中的每个人都使用该对象模型,而不是在Web服务客户端或服务实现期间使用wsdl / svcutil每次生成的对象模型。

wsdl / svcutil是否有一个参数(任何其他方式)在执行期间不为模式类型生成类?

3 个答案:

答案 0 :(得分:3)

我不知道任何特定的设置或命令行开关来强制执行此操作 - 您可以做什么,但这主要是通过检查来训练和执行,是共享类库(程序集,在DLL中) )与开发人员一起确保每个人都引用该公共类库,并单独在“添加服务引用”对话框(在“高级”页面)中保留默认设置:

alt text http://i45.tinypic.com/11b68sh.png

在这里,您定义WCF将重用它可以在任何引用的程序集中找到的任何类型 - 因此,如果您的开发人员添加对公共数据协定库的常规引用,那么WCF将使用这些类型而不是重新创建它们一遍又一遍。

但同样 - 这只是一种“通过示例管理并检查”的方法 - 我不知道有任何技术方法可以强制执行此操作。

答案 1 :(得分:3)

我相信你要找的是:svcutil.exe /r your-dtos.dll

  

/参考: -   指定的引用类型   部件。生成客户端时,请使用   此选项指定组件   可能包含代表的类型   正在导入元数据。 (短:   / r)的

在我看来,WCF代理,端点通道,服务操作和dto有效负载紧密耦合到同一个生成的客户端代理是一个主要的设计缺陷。

这促使我在open web services framework中解决了解决终点和有效负载的问题:

  • 能够调用任何Web服务的同一Web服务客户端(即Soap11,Soap12,XML,JSON)。
  • 它还允许我在任何Web服务客户端中使用相同的DataContract dto实例
  • 这有许多好处,包括能够在多个不同端点上公开相同的Web服务而无需任何额外配置。从而为我的服务的每个消费者提供优化的Web服务端点。例如。
    • 用于互操作性和强类型客户端的XML,
    • Ajax客户端的JSON,
    • 适用于喜欢生成代码的环境的WSDL(即Flex Builder,VS.NET'添加服务引用'等)

在我的公司,我们已经开发了数百种不同客户端的Web服务,即Ajax,Flash / ActionScript,C ++,Silverlight,ASP.NET,并且能够通过不同的端点调用相同的Web服务,为我们节省了无数小时。

答案 2 :(得分:0)

如果从服务配置文件中删除mex端点,则客户端应用程序将无法发现并生成代理对象。

如果我正确理解您的问题,处理这种情况的方法是执行以下操作:

  1. 创建一组包含服务和数据对象/共享对象模型的通用DLL。
  2. 使用公共dll中的合约创建服务,而不是在创建新服务时Visual Studio创建的合同。
  3. 从服务器配置文件中删除MEX端点(这实际上会破坏代理生成)。
  4. 让您的客户使用公共dll并在客户端手动创建频道(通过频道工厂等...)。
  5. 在这种方法中,你根本不使用wsdl.exe / svcutil.exe,因为你基本上绕过了wsdl。由于您手动管理连接,因此不添加服务引用。

    编辑:按照这种方法,客户端仍然可以尝试通过wsdl.exe / svcutil.exe生成代理对象,但是他们无法从wsdl获取正确的信息。它们本质上会生成一个不起作用/不完整的代理。