2

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

模型

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

我试图将两者都托管在同一个 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>

/Service.svc/About 中带有合同“IHttpGetHelpPageAndMetadataContract”的 ChannelDispatcher 无法打开。

任何帮助表示赞赏。

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

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

4

3 回答 3

1

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

请澄清。


参考这个现有的帖子,让我知道它是否有意义。


上面的帖子暗示了实现,请参阅这篇帖子了解部署细节。

于 2013-02-08T13:23:59.630 回答
0

所以我发现,即使 testdummy 服务以编程方式添加,它仍然得到服务元数据行为。

我的解决方案是不使行为默认 - 在名称中给出:

应用程序配置:

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

//.. 之后:

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

其余的代码,声明相同

于 2013-02-08T12:19:03.627 回答
0

您不能添加另一个端点并使用不同的名称填写地址:

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

网址变为 /Service.svc/SecondService

于 2013-02-08T12:30:54.330 回答