我有一个 WCF 服务器库和客户端 [Winform],我使用自托管 winform 启动服务器。
我想让客户端发现 LAN 上的事件服务器,以另一种方式获取列表中的在线服务器 IP 地址。我尝试了 DiscoveryClient
和 UdpDiscoveryEndpoint
并且它有效这是代码:
客户端[Winform] :
private void button1_Click(object sender, EventArgs e)
{
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(IFileManager)));
foreach (EndpointDiscoveryMetadata ep in findResponse.Endpoints)
{
listView1.Items.Add(ep.Address.ToString());
}
}
服务器[Winform] :
ServiceHost host = new ServiceHost(typeof(MainService));
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Start")
{
host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
host.Open();
button1.Text = "Stop";
}
else
{
host.Close();
button1.Text = "Start";
}
}
但它并没有像我预期的那样工作!
更新:
在我使用 WCF 之前,我已经在 TCP 套接字上开发了一个服务器发现,我使用了 try/catch 的并行线程来连接并循环超过 255 个 IP 地址,例如:(192.168.1.X),我在 LAN 5 服务器上尝试过 [PC] ,结果是如此完美和快速,我坐了一个超时(3 秒)
但是在 WCF 上,我不知道我将如何完成这个!!
最佳答案
Why do i have to give a specific Criteria to ClientDiscovery ? i have many interfaces, i just need the host address, not the address of the interface!
这就是解耦的重点,您需要的所有服务都在单个服务器上这一事实是一个实现细节。也就是说,您可以将您的客户端耦合到您的特定架构,使用从发现过程的第一个结果中收到的 MEX 地址中的信息手动创建客户端。
it takes too much time [about 15-20s] to get the list, isn't suppose to be fast?
不,如果您正在寻找一个服务的多个实例,发现应该不会很快:默认超时为 20 秒。现在,如果您只需要该服务的一个实例(大部分时间),那么您可以通过将 FindCriteria 的 MaxResults 属性设置为 1 来明确告诉客户端在找到第一个服务后停止。这比等待超时。
有关更多信息,您可以查看此 excellent article .
更新
您可以通过 FindCriteria.Duration 设置超时属性(property)。
更新 2
您可以通过 MEX 端点获取有关该服务的所有信息。您可以将 MetadataExchangeClient 与您从发现中获得的 MEX 地址一起使用,并使用您返回的 MetadataSet 中的信息(请参阅 http://msdn.microsoft.com/en-us/library/ms730243.aspx,检索服务元数据),但我不确定您使用的是哪种信息会回来的,因为我从来没有这样使用过它。
这取决于您所说的状态:WS-discovery 没有我所知道的状态概念,无论服务是否存在。对此概念的任何其他解释,您必须在您的服务中作为一项操作自行实现。
关于c# - WCF 服务发现问题,需要多长时间才能返回结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426485/