6

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

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

4

3 回答 3

3

我相信您正在寻找的是:svcutil.exe /r your-dtos.dll

/reference: - 指定程序集中的引用类型。生成客户端时,使用此选项指定可能包含表示正在导入的元数据的类型的程序集。(简称:/r)

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

这就是促使我在我的开放式 Web 服务框架中解决问题的原因,在该框架中我解耦了端点和有效负载,它允许:

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

在我的公司,我们开发了数百个 Web 服务,由许多不同的客户端调用,例如 Ajax、Flash/ActionScript、C++、Silverlight、ASP.NET,并且能够通过不同的端点调用相同的 Web 服务为我们节省了无数时间。

于 2010-02-16T17:53:34.763 回答
3

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

替代文字

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

但同样——这只是一种“以身作则和检查”的方法——我不知道有任何技术方法可以强制执行这一点。

于 2010-02-16T17:17:25.960 回答
0

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

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

  1. 创建一组具有服务和数据合同/共享对象模型的通用 DLL。
  2. 使用通用 dll 中的合同创建服务,而不是使用 Visual Studio 创建新服务时创​​建的合同。
  3. 从服务器配置文件中删除 MEX 端点(这基本上会中断代理生成)。
  4. 让您的客户端使用通用 dll 并在客户端手动创建通道(通过通道工厂等...)。

在这种方法中,您根本不使用 wsdl.exe/svcutil.exe,因为您实际上是在绕过 wsdl。您也无需添加服务引用,因为您是手动管理连接。

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

于 2010-02-16T17:10:55.023 回答