WCF多个服务在同一个Config中具有相同的合同

时间:2013-02-08 11:37:14

标签: c# wcf rest

我试图托管同一合同的不同服务实现:

Model

原因是需要一个虚拟实现来进行外部测试。

我试图在同一个WindowsService中托管两者:

    private ServiceHost _host;
    private ServiceHost _dummy;
    protected override void OnStart(string[] args)
    {
        _host = new ServiceHost(typeof(Service));
        _host.Open();

 //trying to avoid the app.config beeing used - because its already been hoste by _host
        _dummy = new ServiceHost(typeof(TestDummyService));
        _dummy.Description.Endpoints.Clear();
        _dummy.AddServiceEndpoint(typeof(IService), 
                                   new WebHttpBinding(),
                                  @"<link>/Dummy.svc/");
        _dummy.ChannelDispatchers.Clear();
        _dummy.Open();
     }

这是配置文件:

  <system.serviceModel>
    <services>
      <service name="namespace.Service">
        <host>
          <baseAddresses>
            <add baseAddress="<link>/Service.svc"/>
          </baseAddresses>
        </host>
        <endpoint address="" 
                  binding="webHttpBinding" 
                  contract="namespace.IService" 
                  behaviorConfiguration="web" />

        <endpoint address="/mex" 
                  binding="mexHttpBinding" 
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors >
        <behavior>
          <serviceMetadata httpGetEnabled="true"
                           httpGetUrl="<link>/Service.svc/About" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name ="web">
          <webHttp />         
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

带有合约'IHttpGetHelpPageAndMetadataContract'的/Service.svc/About上的ChannelDispatcher无法打开。

感谢任何帮助。

更新1 我的目标是在一个WindowsService中托管同一个合同(IService)的两个不同实现。

我还想在配置文件中配置它们。

3 个答案:

答案 0 :(得分:1)

我想知道什么是业务场景。我猜想,客户端不应该知道实现,它只是服务的URL指示(或路由)实现。

请澄清。


请参阅此现有post并告知  我知道它是否有意义。


以上帖子暗示了实现,请参阅此post了解部署详情。

答案 1 :(得分:0)

所以我发现,即使是testdummy服务添加了程序,它仍然得到服务metadatabehavior。

我的解决方案是不要将行为默认 - 在名称上给出:

的app.config:

<service name="namespace.Service" behaviorConfiguration="someName">

// ..稍后:

    <behavior name="someName">
      <serviceMetadata httpGetEnabled="true"
                       httpGetUrl="<link>/Service.svc/About" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>

其余的代码,同样的

答案 2 :(得分:0)

无法添加其他端点并使用不同的名称填写地址:

<endpoint address="/SecondService" 
              binding="webHttpBinding2" 
              contract="namespace.IService" 
               />

Url成为/Service.svc/SecondService