我在.NET 4.5上使用C#编写的客户端和服务器应用程序正在使用SslStream进行通信。
但是,在第一次启动客户端或服务器时,设置SslStream的速度非常慢,通常需要8-10秒。
我已经在dotTrace中加载了应用程序,并发现大部分时间都花在我们的AcceptConnection方法中(这本身就是从Socket.BeginAccept()回调的一部分),如图所示下面的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签名证书,并且安装在本地计算机个人存储中。
过去几天我一直在搜索谷歌并且遇到了一堵砖墙。 关于如何确定延迟原因的任何建议?
答案 0 :(得分:0)
你能告诉我,你的电脑有互联网连接吗?如果没有,因为这些是签名的dll的窗口将尝试从其服务器下载CRL,以确保这些文件没有被篡改。尝试在Internet Explorer中禁用“检查发布者吊销” 否则,请尝试在您的应用程序中放入一个配置文件以及同名示例applicationName.exe.config
的.exe文件此文件应包含
<configuration>
<runtime>
<generatePublisherEvidence enabled="false" />
</runtime>
</configuration>