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>

コントラクト 'IHttpGetHelpPageAndMetadataContract' を含む /Service.svc/About の ChannelDispatcher を開くことができません。

どんな助けでも大歓迎です。

更新 1 私の目標は、同じコントラクト ( IService) の 2 つの異なる実装を 1 つの WindowsService でホストすることです。

また、構成ファイルで両方を構成したいと思います。

4

3 に答える 3

1

では、ビジネス シナリオについて知りたいと思います。私が推測するのは、クライアントは実装を知っているべきではなく、サービスの URL だけが実装を示す (またはルーティングする) ことです。

明確にしてください。


この既存の投稿を参照して、それが理にかなっている場合はお知らせください。


上記の投稿は実装を示唆しています。展開の詳細については、この投稿を参照してください。

于 2013-02-08T13:23:59.630 に答える
0

そのため、testdummy サービスがプログラムで追加されたとしても、サービスのメタデータの動作がまだ残っていることがわかりました。

私の解決策は、動作をデフォルトにしないことでした-名前で与えられました:

app.config:

<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" 
               />

URL は /Service.svc/SecondService になります

于 2013-02-08T12:30:54.330 に答える