问题
我有这个奇怪的问题。我在控制台应用程序中托管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 :(得分: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年,所以事情可能会从那时起发生变化,但我在代码中始终依赖这些事件。对于那些说双工模型没有看到频道截止的人,我不理解。