我们有以下代码...
[ServiceContract]
public interface IDiscoveryService
{
[OperationContract]
void PrintHello();
}
public class DiscoveryService : IDiscoveryService
{
public void PrintHello()
{
MessageBox.Show("Hello");
}
}
private void InitializeDiscovery()
{
Uri baseAddress = DiscoveryHelper.AvailableTcpBaseAddress;
ServiceHost host = new ServiceHost(typeof (DiscoveryService), baseAddress);
host.EnableDiscovery();
host.Open();
}
private void DiscoverAddressClick(object sender, EventArgs e)
{
EndpointAddress address = DiscoveryHelper.DiscoverAddress<IDiscoveryService>();
Binding binding = new NetTcpBinding();
IDiscoveryService proxy = ChannelFactory<IDiscoveryService>.CreateChannel(binding, address);
proxy.PrintHello();
(proxy as ICommunicationObject).Close();
}
现在,这段代码似乎一直有效,直到我们修改与服务契约有关的任何内容,此时我们收到 TCP 异常,错误代码 10061(主动拒绝连接)。然而,我们无法弄清楚是谁拒绝的,或者为什么拒绝。如果我们尝试将代码恢复到以前的状态,当它工作时,我们不能,它只是在(看起来)我们从项目中添加/删除内容后拒绝工作。
每次我建造时,我都会先清洁。我们也遵循此处发布的说明。
有什么想法吗?
我首先要声明的是,我对 WCF Discovery 不太熟悉……尽管我可能会在我们的新服务器堆栈中实现它。但我在这里没有看到的一件事是您在这里展示的内容中存在代理服务器。
据我在 MSDN 上阅读的内容了解,您的 WCF 服务基本上会将其存在注册到网络上运行的代理服务器。然后,您的客户端将通过 DiscoveryProxy 服务器“发现”您的服务服务器。这可能是您缺少的管道部分。
您当前的服务器实现将在 InitializeDiscovery 方法完成后立即关闭服务器,因为您的主机只有函数范围,并且将被垃圾收集器清理,除非您在其他地方保留引用。