2013-02-28 119 views
0

问题WCF双工nettcp通道没有故障

我有这个奇怪的问题。我在控制台应用程序中托管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; 
+0

我知道你的帖子是旧的,下面的答案没有回答这个问题。我不确定您在寻找这些事件的位置 - 如果您的DuplexClient 创建时您正在订阅,然后传递给您的服务? 如果你找到了答案 - 请发布。 – Stix 2015-11-10 16:07:00

回答

1

从MSDN: 双工模式,当一个服务或客户端关闭其通道不会自动检测。因此,如果服务意外终止,默认情况下服务将不会被通知,或者如果客户端意外终止,服务将不会被通知。客户和服务可以实施他们自己的协议,以便他们如此选择通知对方。

0

AFAIK tcp通道对(持续)连接问题相当敏感,但您可以在服务器变得不可用之前使用回调来通知客户端。从客户端,你可以使用一些虚拟ping /戳方法'OnTimer'来获得实际的连接状态/保持通道活着。我想,在那个时候恢复客户端代理(重新连接)是很好的。如果服务提供元数据终结,您也可以拨打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) 
0

,如果你是客户,并预订所有3个事件,IClientChannel的闭幕,关闭和故障,如果关闭服务控制台应用程序,至少应该看到“关闭”和“关闭”事件。我不知道为什么。如果你正确关闭,你会认为你会看到Faulted。我使用tcp.net全双工通道,并且我看到这些事件很好。请记住它是在2017年,所以事情可能从那时起发生了变化,但我始终依靠这些事件在我的代码中。对于那些表示双面打印机模型没有看到关闭频道的人,我不理解这一点。