私が使用している .NET 3.5 デスクトップ アプリケーションは、テスト マシンがオフィスの外にあるときはいつでも、定期的に機能の低下を示していました。
インターネットに接続していないオフィスのマシンでエラーを再現することができましたが、ANTS パフォーマンス プロファイラーを使用して初めて、何が起こっているのかをより明確に把握することができました。
ANTS では、NHibernate が System.Data.SqlServerCE.dll アセンブリを読み込もうとしたときにアプリケーションで見られた遅延に対応する最大 16 秒かかる「同期の待機中」を見ました。
アクションをすぐに再試行すると、遅延なく動作しますが、5 分間そのままにしておくと、次に試したときに再びロードするのが遅くなります。
これまでの私の調査では、SqlServerCE dll が署名されているため、システムが証明書失効リストを取得するために接続を試みてタイムアウトしたことが原因のようです。
インターネット オプションの LAN 設定で [設定を自動的に検出する] 設定を無効にすると、[発行者証明書の失効を確認する] を無効にすると、問題が解消されます。
しかし、このアプリケーションが展開される管理者は、マシンごとまたはユーザーごとに証明書チェックを無効にするという考えに満足していないので、アプリケーション レベルで CRL チェックを無効にする必要があります。
この動作を説明する .net 2.0 には十分に文書化されたバグがあり、構成ファイル要素で可能な修正を提供します。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>
ただし、.net 3.5 を使用しているにもかかわらず、これは機能しません。
SQLServerCE dll は NHibernate によって動的にロードされています。動的であるという事実が何らかの理由で設定が機能しないのではないかと思いますが、それを確認する方法がわかりません。
構成設定が機能しない理由について、誰かが提案できますか?
または、アプリケーション レベルでチェックを無効にする別の方法はありますか。おそらく、インストール時にアプリケーションの例外を設定するために使用できる CAS ポリシー設定ですか?
または、信頼レベルを上げるためにアプリケーションで変更できるものはありますか?