-1

我有一个在 .NET 4.5 上用 C# 编写的客户端和服务器应用程序,它们使用 SslStream 进行通信。

但是,在客户端或服务器第一次启动时,设置 SslStream 非常慢,通常需要 8-10 秒左右。

我已经在 dotTrace 中加载了应用程序,发现大部分时间都花在了我们的 AcceptConnection 方法(它本身,作为 Socket.BeginAccept() 回调的一部分),如 dotTrace 调用所示跟踪如下:

dotTrace 输出

生成上述跟踪的 SocketManager 类的源代码是(为简洁起见,删除了日志语句):

public void AcceptConnection( ClientCommunicationManager ccm )
{
    _ns = new NetworkStream( Sock, true );
    _sslStream = new SslStream( _ns, true );
    X509Store certs = new X509Store( StoreName.My, StoreLocation.LocalMachine );
    certs.Open( OpenFlags.ReadOnly );
    X509Certificate2 machineCert = certs.Certificates.Find( X509FindType.FindBySubjectName, Environment.MachineName, true )[ 0 ];
    certs.Close( );

    _sslStream.AuthenticateAsServer( machineCert, true, SslProtocols.Tls12, true );

    _sslStream.BeginRead( ReceiveBuffer, 0, ReceiveBuffer.Length, ReceiveData, ccm );
}

我们的 ClientCommunicationManager 类中的以下代码是导致调用 AcceptConnection 函数的原因:

private void AcceptClientConnection( IAsyncResult ar )
{
    ClientCommunicationManager ccm = ar.AsyncState as ClientCommunicationManager;
    Socket acceptedSocket = _listenerSocket.EndAccept( ar );
    SocketManager manager = new SocketManager( ccm, acceptedSocket );
    _listenerSocket.BeginAccept( AcceptClientConnection, this );

    manager.AcceptConnection( this );
}

dotTrace 声称该函数中 97.95% 的时间都花在了对“ProcessAuthentication”的调用上,这不是我明确调用的,所以我不知道是什么产生了这个调用。

服务器具有有效的 CA 签名证书,并且安装在本地计算机个人存储中。

在过去的几天里,我一直在搜索谷歌,结果遇到了一堵砖墙。关于如何确定此延迟原因的任何建议?

4

1 回答 1

0

你能告诉我,你的电脑有互联网连接吗?如果没有,因为这些是签名的 dll 的 windows 将尝试从其服务器下载 CRL 以确保这些文件没有被篡改。尝试在 Internet Explorer 中禁用“检查发布者吊销”。
否则,请尝试将配置文件与同名示例 applicationName.exe.config 的 .exe 一起放入您的应用程序

该文件应包含

<configuration>
    <runtime>
    <generatePublisherEvidence enabled="false" />
  </runtime>
</configuration>
于 2013-11-05T17:19:54.703 回答