我希望服务器使用 WCF Discovery 不断跟踪可用客户端。
public void Start()
{
findCriteria = new FindCriteria(typeof(ITestRunnerAgent))
{
Scopes = {new Uri(scope)},
Duration = TimeSpan.FromMilliseconds(DiscoveryIntervalInMiliseconds)
};
discoveryClient = GetInitilizedDisoveryClient();
discoveryClient.FindAsync(findCriteria);
}
private DiscoveryClient GetInitilizedDisoveryClient()
{
var client = new DiscoveryClient(new UdpDiscoveryEndpoint());
client.FindProgressChanged += OnFindProgressChanged;
client.FindCompleted += OnFindCompleted;
return client;
}
private void OnFindCompleted(object sender, FindCompletedEventArgs e)
{
if (!e.Cancelled)
{
// HERE! Sometimes e.Error is not null, but as described in question
discoveryClient.FindAsync(findCriteria);
}
}
不幸的是,有时在评论指定的点我会得到一个中止的 Udp 通道:
通讯对象, System.ServiceModel.Channels.UdpChannelFactory+ClientUdpDuplexChannel, 不能用于通讯 因为它已经被中止了。
有人知道为什么吗?
您办公室的某些网络基础设施可能会断开连接。
您应该编写代码来检查中止的通信并从中恢复。
要恢复,您可以关闭中止的通道并创建一个新通道。
嗯,这并不能回答你的问题,但我对你的代码感到有点警惕。这看起来基本上是正确的,但感觉你的发现可能运行得非常快。我会在一个单独的线程中实现重复发现,并有一些睡眠时间,只是为了让网络更快乐。只是想清理代码。抱歉,如果这没有帮助。
public void Start()
{
var bw = new System.ComponentModel.BackgroundWorker();
bw.DoWork += new System.ComponentModel.DoWorkEventHandler(DiscoveryThread);
bw.RunWorkerAsync();
}
private void DiscoveryThread(object sender, System.ComponentModel.DoWorkEventArgs e)
{
var client = new DiscoveryClient(new UdpDiscoveryEndpoint());
var findCriteria = new FindCriteria(typeof(ITestRunnerAgent))
{
Scopes = {new Uri(scope)},
Duration = TimeSpan.FromMilliseconds(DiscoveryIntervalInMiliseconds)
};
while(true)
{
client.Find(findCriteria);
// lock, clear, and add discovered endpoints to a global List of some sort
System.Threading.Thread.Sleep(3000);
}
}
由于它是异步操作,线程在执行FindAsync(criteria)方法后终止。只是在方法调用后编写 Console.Readline() 或使用 Autoreset 事件保持线程。