1

同じポートで複数の WCF REST サービスをホストしようとしています。Net.Tcp ポート共有サービスを開始しました。これが app.config ファイルです。

<?xml version="1.0"?>
<configuration>

  <system.serviceModel>    
    <services>  
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/services/"/>
          </baseAddresses>
        </host>

        <endpoint
          address="test"
          binding="webHttpBinding"
          contract="IMyService"/>
      </service>
    </services>

    <behaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <netTcpBinding>
        <binding name="PortSharingEnabled" portSharingEnabled="true">
        </binding>
      </netTcpBinding>
    </bindings>

  </system.serviceModel>

</configuration>

同じポートで 2 つのサービスをホストすることはまだできません。

2 番目のサービスを実行しようとすると、次のエラーが表示されます: http://screencast.com/t/Vlakb26XbuQr「ローカル コンピューターのサービス サービスが開始され、その後停止しました。他のサービスまたはプログラムで使用されていない場合、一部のサービスは自動的に停止します」。

トレース ログ ( http://screencast.com/t/tJ5Gvmy4Dgm7 ) には、 「HTTP は URL http://+:7778/MyServiceName/を登録できませんでした。別のアプリケーションが既にこの URL をHTTP.SYSに登録しています。」

編集:

<services>
  <service name="Service1">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/"/>
      </baseAddresses>
    </host>
    <endpoint
      address="first"
      binding="webHttpBinding"
      contract="IService1"/>
  </service>
  <service name="Service2">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/"/>
      </baseAddresses>
    </host>
    <endpoint
      address="second"
      binding="webHttpBinding"
      contract="IService2"/>
  </service>
</services>

ポート共有を有効にするために何かが欠けていると思いますか?

4

2 に答える 2

1

あなたがやろうとしていることは意味がありません。「ポート共有」は次の 2 つの方法で発生します。

  • Http: HTTP は HTTP.SYS カーネル レベル ドライバーによって処理されるため、これは Windows ですぐに使用できます。特に何もする必要はありません。

  • Net.Tcp ポート共有。これには、ここで説明する手順が必要です。

ただし、(唯一の) エンドポイントは、Net.Tcp-Binding ではなく HTTP-Binding を使用するように構成されているため (これは、REST スタイルのサービスを使用する場合に意味があります)、ここでは Net.Tcp ポート共有は適用されません。 .

正確に何をしたいのか、どのようなエラーが表示されているのかについての詳細情報がなければ、助けるのは困難です.

編集

まだ混乱しています。エンドポイントにポート 80 を使用しているように見えますapp.configが、引用したエラー メッセージにはポート 8080 と表示されています。

提供されたエラー メッセージから、サービスをまったく同じエンドポイント URI で 2 回登録/開始しようとしているように見えます。これは機能しません。hostname:portパスの一部または一部を再利用できますが、完全な URI は一意である必要があります。

たとえば、次のエンドポイント URI を使用できます。

これは Net.Tcp ポート共有でも同じであることに注意してください。ポートは共有できますが、完全な (一意の) エンドポイント URI は共有できません。したがって、名前の名前は「ポート」共有です。これは、透過的な負荷分散メカニズムなどではありません。

于 2011-08-26T10:10:31.760 に答える
0

受け入れられた答えがありますが、サービスをプログラムで定義するときに同様の問題があったことをそこに捨てます。次の方法でサービスを作成します。

_serviceHost = new ServiceHost(_cmdService, new Uri(_serviceAddress));

ServiceEndpoint endPoint =
    _serviceHost.AddServiceEndpoint(typeof(IHttpCmdService), _binding, _endpointAddress);
endPoint.Behaviors.Add(new WebHttpBehavior());

_serviceAddress驚くべきことに、同じ値と異なる値でこれを複数回実行しようとする_endpointAddressと失敗します。しかし、アドレス全体を に入れる_serviceAddressと成功します。どちらの方法でも、最終的なサービス URL は同じになります。

したがって、これを知っていると、さまざまなbaseAddress値でサービスを作成した場合、正常に開始されるのではないかと考えています。次のようになります。

<services>
  <service name="Service1">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/first/"/>
      </baseAddresses>
    </host>
    <endpoint
      address=""
      binding="webHttpBinding"
      contract="IService1"/>
  </service>
  <service name="Service2">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/second/"/>
      </baseAddresses>
    </host>
    <endpoint
      address=""
      binding="webHttpBinding"
      contract="IService2"/>
  </service>
</services>
于 2012-01-24T23:32:17.040 に答える