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

时间:2014-11-11 13:17:08

标签: c# web-services wcf

我有2个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中定义的类型,但这并没有起作用并且抱怨类型不一样,我怎么能解决这个问题?

更新

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

protected void Update (Guid entityId)
{
    MyEntity entity = new MyEntity();        

    using (ServiceAClient client = new ServiceAClient())
    {
        entity = client.GetMyEntity(entityId);
    }

    //Do stuff
}

1 个答案:

答案 0 :(得分:3)

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

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

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

  3. 我最好建议使用添加服务参考并手动滚动客户端代理。

    一旦执行,您将拥有其他库:

    1. A.Contracts.dll - 在此定义服务A的所有服务接口和数据模型
    2. B.Contracts.dll - 在这里定义服务B的所有服务接口和数据模型
    3. Common.Contracts.dll - 如果A& B有常见的类型,把它们放在这里。 (规范数据模型)
    4. A.Service.dll - 服务实施
    5. B.Serivce.dll - 服务B实施
    6. ClientProxies.dll - 为您的所有服务提供自己的客户端代理
    7. 您现在不必实施上述所有方法。所需的只是手动 ClientProxies.dll ,您可以随后根据需要迭代到其余部分。

      更多