如何提供一种';s定义为另一个web服务(共享类型)

本文关键字:定义 另一个 web 服务 类型 共享 何提供 一种 | 更新日期: 2023-09-27 18:30:03

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

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

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

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

这不起作用,并抱怨类型不一样,尽管服务B使用的是服务A中定义的类型。我该如何解决这个问题?

更新

由于时间限制,我避免了这个问题,而是将MyEntity的Guid从服务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
}

如何提供一种';s定义为另一个web服务(共享类型)

听起来像是通过Visual Studio的添加服务引用命令使用服务引用。虽然足够,但在中大型项目中可能会变得麻烦,原因是:

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

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

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

一旦执行,您将拥有额外的库:

  1. A.Contracts.dll-在这里定义服务A的所有服务接口和数据模型
  2. B.Contracts.dll-在这里定义服务B的所有服务接口和数据模型
  3. Common.Comments.dll-如果A&B有常见的类型,把它们放在这里。(规范数据模型)
  4. A.Service.dll-服务A实现
  5. B.Serivce.dll-服务B实现
  6. ClientProxies.dll-为所有服务滚动您自己的客户端代理

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

更多

  • 在我的另一个SO答案中以正确的方式告诉我更多关于WCF的信息