WCF双工nettcp通道没有故障

时间:2013-02-28 12:54:34

标签: wcf nettcpbinding duplex

问题

我有这个奇怪的问题。我在控制台应用程序中托管WCF服务器:                 Console.WriteLine(“按'q'退出。”);

            var serviceHost = new ServiceHost(typeof(MessageService));
            serviceHost.Open();
            while (Console.ReadKey().KeyChar != 'q')
            {
            }
            serviceHost.Close();

它为发布和订阅公开了两个端点(双工绑定) 当我停止或退出控制台应用程序时,我从未收到客户端出现故障的通道。我希望客户端被告知服务器已关闭。知道这里出了什么问题吗?

我想要的是在控制台应用程序关闭时引发以下任一事件:

    msgsvc.InnerDuplexChannel.Faulted += InnerDuplexChannelOnFaulted;
    msgsvc.InnerChannel.Faulted += InnerChannelOnFaulted;

3 个答案:

答案 0 :(得分:1)

来自MSDN: 双工模型不会自动检测服务或客户端何时关闭其通道。因此,如果服务意外终止,默认情况下不会通知服务,或者如果客户端意外终止,则不会通知服务。客户端和服务可以实现自己的协议,如果他们愿意,可以相互通知。

答案 1 :(得分:0)

AFAIK tcp通道对(持久)连接问题非常敏感,但您可以使用回调在服务器不可用之前通知客户端。从客户端,您可以使用一些虚拟ping / poke方法' OnTimer'获得实际连接状态/保持通道存活。我想,恢复客户端代理(重新连接)是件好事。如果service提供元数据端点,您还可以调用svcutil进行试用连接或以编程方式检索元数据:

  Uri mexAddress = new Uri("http://localhost:5000/myservice");
  var mexClient = new MetadataExchangeClient(mexAddress, MetadataExchangeClientMode.HttpGet);
  MetadataSet metadata = mexClient.GetMetadata();
  MetadataImporter importer = new WsdlImporter(metadata);
  ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

  ContractDescription description =
  ContractDescription.GetContract(typeof(IMyContract));
  bool contractSupported = endpoints.Any(endpoint =>
  endpoint.Contract.Namespace == description.Namespace &&
  endpoint.Contract.Name == description.Name);

ServiceEndpointCollection endpoints = MetadataResolver.Resolve(typeof(IMyContract), mexAddress, MetadataExchangeClientMode.HttpGet)

答案 2 :(得分:0)

如果您是客户,并订阅所有3个事件,IClientChannel的Closing,Closed和Faulted,如果您关闭服务控制台应用程序,您应该至少看到Closing和Closed事件。我不知道为什么。如果你正确关闭,你会认为你会看到Faulted。我正在使用tcp.net全双工通道,我看到这些事件就好了。请记住它是在2017年,所以事情可能会从那时起发生变化,但我在代码中始终依赖这些事件。对于那些说双工模型没有看到频道截止的人,我不理解。