AuthenticateAsServerAsync挂起

时间:2016-06-18 13:20:00

标签: c# .net ssl networking server

我正在使用

await stream.AuthenticateAsServerAsync(serverCert, true, SslProtocols.Tls, false);

在我的应用程序中保护连接。 不幸的是,在极少数情况下(大约1000个中的一个),这完全挂起。 我尝试在较低级别NetworkStreamTcpClient设置超时。

但没有任何作用,这些联系随着时间的推移不断累积。

由它完全挂起我的意思是它被困在那里好几天(如果应用程序运行那么久)。

我目前用肮脏的黑客解决了这个问题。我开始一个新线程,在其中等待5秒,如果调用没有及时返回,我调用tcpClient.Close()强制SslStream中止。

这是什么问题? 一般情况下,处理函数超时但是没有需要TimeSpan或CancellationToken的重载时,处理这种情况的方法是什么?

tcpClient上的较低级别超时是否至少抛出异常?为什么不发生这种情况?

1 个答案:

答案 0 :(得分:0)

原因

似乎所有网络相关内容的异步版本都不支持超时。 这就是为什么AuthenticateAsServerAsync也不支持超时。

来自文档:

  

请注意

     

此属性仅影响通过调用Read方法执行的同步读取。此属性不会影响通过调用BeginRead方法执行的异步读取。

我是如何解决的

在我启动AuthenticateAsServerAsync(...)之前,我首先启动我自己的任务延迟。

Task.Run(async() {
    await Task.Delay(TimeSpan.FromMinutes(1));
    tcpClient.Close();
});

如果有人有更好的方法,请告诉我:)