質問

.configファイルに基づいてServiceHostsを動的に作成する小さなWCFホスティングエンジンを作成しています。一般的な考え方は、すべてのサービスをオフラインにすることなく、実行時に既存のサービスを削除し、新しいサービスを追加できるようにすることです。

問題の単体テストに遭遇しましたが、これは思ったほど簡単ではないかもしれないことを示しています。特定のエンドポイントに対してServiceHostは1つしか存在しないようです(1つのServiceHostにサービスの複数の異なるエンドポイントが存在する場合でも)。通常、これは問題ではありませんが、サービスを再構成する必要がある場合、元のServiceHostを停止しても、実際にはそのエンドポイントアドレスの登録は強制終了されません。同じサービスに対して別のServiceHostを作成しようとすると(同じエンドポイントが使用されることを意味します)、次の例外で失敗します。

System.InvalidOperationException: The ChannelDispatcher at 'net.pipe://localhost/' with contract(s) '"ITestService"' is unable to open its IChannelListener. --->
System.InvalidOperationException: A registration already exists for URI 'net.pipe://localhost/'.

実際に単体テスト中にエラーが発生しています。テストでは1つのユニットを実行します。これにより、ServiceHostsとホスティングエンジンが人間の可能な限り完全に閉じられます。次に、ホスティングエンジンの別のインスタンスを作成し、別のテストのために同じServiceHostsを再作成しようとします。 2番目のテストでは、上記のエラーが発生します。 ServiceHost.Close()が呼び出されても、実際にはサービスホストが破壊されないのではないかと推測しています。 GCが古いサービスホストをクリーンアップしているかどうかはわかりません...最初に発生した後も問題は解決せずに持続します(私が判断できた限りでは...私はこれまで約30分待っていました。 )

system.serviceModelの構成ファイルは次のとおりです。

  <system.serviceModel>
    <services>
      <service name="Campus.Core.ServiceModel.TestServiceStub">
        <endpoint          
          address="net.pipe://localhost"          
          binding="netNamedPipeBinding"           
          contract="Campus.Core.ServiceModel.ITestService"
        />
      </service>
    </services>
  </system.serviceModel>
役に立ちましたか?

解決

他の誰かが問題に遭遇した場合に備えて、この質問への回答を提供します。実際には、次のように、この問題には2つの原因があることが判明しました。

1)ユニットテスト中に例外が発生した場合、通常、ServiceHostを閉じる前にテスト対象のコードから抜け出します。これにより、ServiceHostは特定のエンドポイントにバインドされたままになりました。これにより、同じコードを実行する後続のすべてのテストが失敗しました。 SubSpecとxUnitを使用してBDDを実行していたとき、1つのテストケース(BDDの用語に関する懸念)がテストごとに1つのアサーションを実行しました。

2)MEXエンドポイントに注意してください。 MEXエンドポイントは、サービスごとに1つしか存在できません。最初に、httpおよびnet.tcp mexエンドポイントを作成しました。ただし、2番目に起動したMEXエンドポイントのインスタンスが例外をスローしたため、これにより問題が発生しました。一般的に、MEXエンドポイントを利用する場合、使用するのを妨げる物理的なインフラストラクチャの問題がない限り、HTTPは使用する最も有用なプロトコルです。

一般的に、ServiceHostでClose()メソッドを呼び出すと、完全にバインドが解除され、以前にエンドポイントにバインドされていたアドレスが再び使用可能になります。クロージャには時間がかかる場合があり、まれに例外がスローされる場合があります。 SubSpecでBDDを実行し、テストごとに単一のアサーションのルールに従っている場合、ServiceHostsクロージャーを妨げる1つのテストでスローされた例外により、後続のすべてのテストが失敗します。

他のヒント

1つの答えは、1つをスピンアップするたびにサービスホストのURLにGUIDを追加し、ServiceHostインスタンスをスピンアップしてクライアント側のチャネルを返すファクトリアプローチを使用することです。使用するURL。

IDesignのInProcFactoryサンプルはこのアプローチを使用しているため、そのまま使用できる場合があります。

http://www.idesign.net/idesign/DesktopDefault .aspx?tabindex = 5&amp; tabid = 11

サンプルをダウンロードするには、IDesignのサイトに登録する必要があり、トレーニングなどについて時折アナウンスを送信しますが、それほど多くないことに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top