0

我们有以下代码...

发现服务.cs

[ServiceContract]
public interface IDiscoveryService
{
    [OperationContract]
    void PrintHello();
}

public class DiscoveryService : IDiscoveryService
{
    public void PrintHello()
    {
        MessageBox.Show("Hello");
    }
}

服务器.cs

    private void InitializeDiscovery()
    {
        Uri baseAddress = DiscoveryHelper.AvailableTcpBaseAddress;
        ServiceHost host = new ServiceHost(typeof (DiscoveryService), baseAddress);
        host.EnableDiscovery();
        host.Open();
    }

客户端.cs

    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(主动拒绝连接)。但是,我们无法弄清楚谁在拒绝,或者为什么。如果我们试图将我们的代码恢复到以前的状态,当它工作时,我们不能,它只是在(似乎)我们从项目中添加/删除东西之后拒绝工作。

每次我建造时,我都会先清洁。我们也遵循此处发布的说明

有什么想法吗?

4

2 回答 2

0

我将首先说明我对 WCF Discovery 不是很熟悉......尽管我可能会在我们的新服务器堆栈中实现它。但是我在这里看不到的一件事是您在此处展示的内容中存在代理服务器。

据我在MSDN上阅读的内容了解,您的 WCF 服务基本上会将其存在注册到网络上运行的代理服务器。然后,您的客户端将通过 DiscoveryProxy 服务器“发现”您的服务服务器。那可能是您缺少的管道。

于 2012-06-29T20:41:08.590 回答
0

您当前的服务器实现将在 InitializeDiscovery 方法完成后立即关闭服务器,因为您的主机只有函数范围,并且将由垃圾收集器清理,除非您在其他地方保留引用。

于 2012-06-29T21:06:17.173 回答