在我的应用程序中,我必须手动启动一个可执行文件。此可执行文件充当服务器并启动 WCF 服务,但整个初始化过程需要时间。在我的客户端(创建了新进程)中,我必须尽快使用 WCF服务。
因此,我通过调用服务的 Ping() 方法每 100 毫秒检查一次服务是否已启动。第一次调用会引发我处理的 EndPointNotFoundException。但第二次调用会引发 CommunicationObjectFaultedException。我已经检查过,在处理 EndPointNotFoundException 后,我用来创建客户端代理的 CommunicationObject 的状态已打开。我的方法是否错误,应该如何检查服务是否启动?
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;
}