【问题标题】:Multiple WCF Services implementing same Service Contract interface多个 WCF 服务实现相同的服务合同接口
【发布时间】:2010-04-26 23:30:06
【问题描述】:

多个wcf服务可以实现同一个服务契约接口吗?

我想要做的是允许测试服务可与真实服务互换,并在配置文件中指定要使用的服务。

例如:

[ServiceContract]
public interface IUselessService  
{  
  [OperationContract]   
  string GetData(int value);   
}  

测试实现

public class TestService : IUselessService  
{  
  public string GetData(int value)  
  {  
    return "This is a test";   
  }  
}  

真正的课堂

public class RealService : IUselessService  
{  
  public string GetData(int value)  
  {  
    return string.Format("You entered: {0}", value);  
  }  
}

【问题讨论】:

  • 如果您发布代码,请在编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮 (101 010) 以很好地格式化和语法突出显示这些行。让世界变得与众不同!谢谢

标签: .net wcf interface


【解决方案1】:

是的,这不仅是可能的,而且明确地在服务合同接口的设计意图之内。

【讨论】:

  • 我试过这样做,但出现配置错误。我可能做错了。我在自己的 .svc 和 .svc.cs 文件中都有每个服务类。然后我指定我想要的服务名称: 然后我更改了服务 XML 元素的 name 属性,然后我得到一个运行时错误,即原始服务没有端点。
  • 我认为您想在配置中引用接口名称,而不是真正的服务。确保两个(所有)实现都使用相同的接口。
  • 要能够使用相同的接口,接口不仅必须具有相同的签名(相同的参数)。在 .NET 类型系统中必须相同。为此,必须将接口的定义放在强签名程序集中,并使用 GACUtil -i MyInterface.dll 放在 GAC 中。然后在两个项目中都必须引用这个程序集。
【解决方案2】:

谢谢大家的回答。我现在有一个适合我的解决方案,无需将接口放在单独的程序集和 GAC 中。我不打算将接口用于其他项目,只是将相同的接口用于同一项目中的多个服务。

我试图做的是在 WCF 服务的配置文件中更改 RealService 和 TestService ,这样客户端就不会知道差异(客户端不必更改其配置以指向不同的 . svc 文件)。我不确定这是否可能,或者至少如果是的话,这绝对不是直截了当的。

我现在所做的只是在 WCF 服务的配置文件中指定这两个服务,然后我根据我想要的服务将客户端指向一个或另一个。由于此 WCF 服务仅供内部使用,并且我们可以控制客户端和服务,因此这是一个不错的权衡。无论如何,这个解决方案的意图可能更明确。

这里是配置文件的sn-p:

<services>
      <service behaviorConfiguration="WcfService1.Service1Behavior"
               name="WcfService1.TestService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding" 
          contract="WcfService1.IUselessService">              
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
      <service behaviorConfiguration="WcfService1.Service1Behavior"
               name="WcfService1.RealService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding"
         contract="WcfService1.IUselessService">             
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

【讨论】:

    【解决方案3】:

    如果您在单独的程序集中定义 IUselessService 接口并将其放置在 GAC 中。这个程序集不应该实现任何东西,只定义 IUselessService 接口和其他一些使用需要作为 IUselessService 参数的类型。

    TestService 和 RealService 都应该实现相同的 IUselessService 接口。我的意思是你应该为每个服务创建两个额外的项目,然后 TestService 和 RealService 不会有类型冲突。

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      相关资源
      最近更新 更多