2
4

1 回答 1

4

好的 - WCF 服务的默认行为是这样的:

  • 您在服务器上定义服务合同、操作和数据合同(例如,在命名空间“Server.MyService”中)
  • 服务启动并运行后,在您的客户端上创建服务引用
  • 这样做时,Visual Studio 或svcutil.exe所做的是询问该服务的元数据(服务方法和数据的描述)
  • 基于该元数据,生成客户端代理(命名空间“Client.MyService”),它包含服务合同(方法)和数据合同的副本

重要:它包含这些东西的复制品!它们看起来相同,并且在不同的名称空间中在线上序列化为相同的 XML 格式——但它们是不同的,最明显的是。

这就是 WCF 的本质——你所做的只是在客户端和服务器之间交换序列化的消息——所有来回的都是文本消息。仅此而已 - 没有对象引用,没有远程对象 - 没有这样的。把它从你的脑海中抛开!:-)

如果您控制线路的两端,这可能会很痛苦 - 如果您需要更改任何内容,则必须在服务器端进行更改,更新客户端引用等等。

因此,如果您控制线路的两端 - 服务器和客户端 - 并且它们都是基于 .NET 的,您可以执行以下操作:

  • 将您的服务合同和数据合同(只有合同 - 没有实现!)放入单独的程序集中
  • 从您的服务实现中,引用该合同程序集
  • 将合同程序集复制到您的客户,并在您的客户项目中引用它

现在,如果您添加服务引用,默认情况下,Add Service ReferenceVisual Studio 中的函数将重用引用程序集中的现有类型 - 因此,如果您引用了常见的“合同”程序集,这些类型(包括它们的命名空间)将被重复使用 - 不会创建额外的副本。

这样,您可以创建服务器端代码和客户端都使用的单个共享合同程序集,并且您不必弄乱任何重复的数据结构。但同样:只有当您控制电线的两端并且两者都是 .NET 时才有效

于 2010-04-09T13:01:09.987 回答