私のアプリケーションでは、実行可能ファイルを手動で開始する必要があります。この実行可能ファイルはサーバーとして機能し、WCF サービスを開始しますが、初期化プロセス全体に時間がかかります。私のクライアント(新しいプロセスを作成したもの)では、 WCF サービスASAPを使用する必要があります。
そのため、サービスの Ping() メソッドを呼び出して、サービスが開始されたことを 100 ミリ秒ごとに確認します。最初の呼び出しは、私が処理する EndPointNotFoundException をスローします。しかし、2 番目の呼び出しは CommunicationObjectFaultedException をスローします。確認したところ、EndPointNotFoundException を処理した後、クライアント プロキシの作成に使用する CommunicationObject の状態は Opened です。私のアプローチは間違っていますか?サービスが開始されているかどうかを確認するにはどうすればよいですか?
UPDATE1: これは、WCF サービスを開始する方法です。
ServiceHost serviceHost = new ServiceHost(typeof(TestService));
const string address = "net.pipe://localhost/testservice";
Binding binding = new NetNamedPipeBinding();
binding.ReceiveTimeout = TimeSpan.MaxValue;
serviceHost.AddServiceEndpoint(typeof(ITestService), binding, address);
serviceHost.Open();
while (true)
{
Thread.Sleep(100);
}
UPDATE2:これは私がプロキシを作成する方法です:
ChannelFactory<ITestService> channelFactory =
new ChannelFactory<ITestService>(new NetNamedPipeBinding(), "net.pipe://localhost/testservice");
_testServiceProxy = channelFactory.CreateChannel();
そして、これは私がサービスをpingする方法です:
private static bool IsServiceAvailable(ITestService serviceProxy)
{
const int maxNumberOfTries = 100;
const int timeout = 100;
bool isServiceAvailable = false;
int numberOfTries = 0;
do
{
Thread.Sleep(timeout);
try
{
serviceProxy.Ping();
isServiceAvailable = true;
}
catch (EndpointNotFoundException)
{}
numberOfTries++;
if (numberOfTries > maxNumberOfTries)
break;
}
while (!isServiceAvailable);
return isServiceAvailable;
}