在我的应用程序中,我必须手动启动可执行文件。此可执行文件充当服务器并启动WCF服务,但整个初始化过程需要时间。在我的客户端(已创建新流程)中,我必须使用WCF服务 ASAP 。
因此,我通过调用服务的Ping()方法检查服务已启动的每100毫秒。第一个调用抛出我处理的EndPointNotFoundException。但第二个调用抛出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;
}
答案 0 :(得分:4)
问题是由于您无法重复使用故障代理,您应该创建一个新代理。
private static bool IsServiceAvailable(ChannelFactory<ITestService> channelFactory)
{
const int maxNumberOfTries = 100;
const int timeout = 100;
bool isServiceAvailable = false;
int numberOfTries = 0;
do
{
Thread.Sleep(timeout);
try
{
using(var proxy = channelFactory.CreateChannel())
proxy.Ping();
isServiceAvailable = true;
}
catch (EndpointNotFoundException)
{}
numberOfTries++;
if (numberOfTries > maxNumberOfTries)
break;
}
while (!isServiceAvailable);
return isServiceAvailable;
}
答案 1 :(得分:3)
.NET框架有一个名为System.ServiceModel.Discovery的命名空间,它有一些可能对您的用例有用的类。特别是允许服务发布公告消息的AnnouncementClient类。来自文档:
公告消息包含有关服务的信息,例如其完全合格的合同名称,服务所在的任何作用域以及服务要发送的任何自定义元数据。
至于能够知道服务何时在线,这个类有一个机制。来自文档:
如果服务添加ServiceDiscoveryBehavior行为并指定AnnouncementEndpoint,则服务在服务联机或脱机时会自动发送通知消息。如果您想自己明确发送公告消息,请使用此类。
提供所需支持的方法有:AnnounceOnline
和AnnounceOffline
,您可以使用这些方法向客户发送有关服务状态的消息。这将允许客户在准备就绪时通知服务,从而无需循环ping。