如何将Web服务中定义的类型提供给另一个Web服务(共享类型)?

我有2个WCF服务。 服务A包含MyEntity类型的定义。 服务B包含对服务A的服务引用,因此可以使用MyEntity的类型。 所以我有一个看起来像这样的方法:

protected void Update (ServiceA.MyEntity entity) { //Do stuff } 

现在我想在Service A中使用这个方法,所以我为Service B添加了一个服务引用并尝试:

 protected UpdateServiceB(MyEntity entity) { using(ServiceB.ServiceClient client = new ServiceB.ServiceClient()) { client.Update(entity); } } 

虽然服务B使用服务A中定义的类型,但这并不起作用并抱怨类型不一样,我该如何解决?

UPDATE

由于时间限制我避免了这个问题,而是将Guid of MyEntity从服务A传递给了服务B. 然后我在服务A中使用了一个名为’GetMyEntity(Guid entityId)’的现有方法来检索服务B中的实体:

 protected void Update (Guid entityId) { MyEntity entity = new MyEntity(); using (ServiceAClient client = new ServiceAClient()) { entity = client.GetMyEntity(entityId); } //Do stuff } 

听起来像是通过Visual Studio的Add Service Reference命令使用服务引用。 虽然足够,但由于以下原因,它可能在中型到大型项目中变得麻烦:

  1. 服务类型在客户端重新定义,而不是使用公共库(如您所发现的)。

  2. 当服务合同发生变化时,这通常会导致服务更新,但由于第1点的原因,客户端代理不会更新。随着模式的发展,客户端代理会变得过时。 你必须刷新参考

我最好的建议是不要使用添加服务引用并手动滚动客户端代理。

执行后,您将拥有其他库:

  1. A.Contracts.dll – 在这里定义服务A的所有服务接口和数据模型
  2. B.Contracts.dll – 在这里定义服务B的所有服务接口和数据模型
  3. Common.Contracts.dll – 如果A和B有常见类型,请将它们放在此处。 (规范数据模型)
  4. A.Service.dll – service一个实现
  5. B.Serivce.dll – 服务B实现
  6. ClientProxies.dll – 为您的所有服务提供自己的客户端代理

您现在不必实现上述所有function。 所需的只是手动ClientProxies.dll ,您可以随后根据需要迭代到其余部分。

更多

  • 在我的其他答案中告诉我更多关于WCF正确方法的信息