-1

SslStream を使用して通信する .NET 4.5 上の C# で記述されたクライアントおよびサーバー アプリケーションがあります。

ただし、クライアントまたはサーバーの最初の起動時に、SslStream のセットアップは非常に遅く、通常は 8 ~ 10 秒程度かかります。

アプリケーションを dotTrace にロードしたところ、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 署名付き証明書があり、ローカル コンピューターの個人用ストアにインストールされています。

私は過去数日間グーグルを精査してきましたが、レンガの壁にぶつかっています. この遅延の原因を特定する方法について何か提案はありますか?

4

1 に答える 1

0

教えてください、あなたのコンピュータはインターネットに接続されていますか? そうでない場合、これらは署名済みの dll であるため、これらのファイルが改ざんされていないことを確認するために、サーバーから CRL をダウンロードしようとします。Internet Explorer で [発行元の失効を確認] を無効にしてみてください。
それ以外の場合は、同じ名前の例 applicationName.exe.config の .exe と一緒に構成ファイルをアプリケーションに入れてみてください。

このファイルには次のものが含まれている必要があります

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