c# - 接受 SSL 套接字时性能非常差

标签 c# .net performance ssl

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

但是,在客户端或服务器首次启动时,设置 SslStream 的速度非常慢,通常需要 8-10 秒。

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

dotTrace output

生成上述跟踪的 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 签名证书,并且安装在本地计算机个人存储中。

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

最佳答案

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

这个文件应该包含

<configuration>
    <runtime>
    <generatePublisherEvidence enabled="false" />
  </runtime>
</configuration>

关于c# - 接受 SSL 套接字时性能非常差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793544/

相关文章:

c# - 通过数组循环项目的最佳实践

c# - 我可以停止服务引用生成 ArrayOfString 而不是 string[] 吗?

C# 并行 - 重复迭代

c# - 加速更新 SQL 查询

python - Swift 与 Python 性能对比

c# - ASPX C# 页面超时

c# - 如何从 HttpContext.Current.Request 获取 URL 的 # 部分

.net - 我该如何解决?错误 : Select is not a member of 'System.Collections.Generic.List(Of String)'

Java NIO 与 DotNet IO 性能对比

c# - 如何使用 MongoDb .net 驱动程序获取集合中所有文档的几个特定字段