プロファイラーを使用することで、Pervasive データベースに接続するときに、エンジンが常に次のようなメッセージをスローすることに気付きましたSystem.Net.Sockets.SocketException
。
ターゲット マシンがアクティブに拒否したため、接続できませんでした ::1:1583
...そして、この小さなスタックトレースだけがあります:
System.Net.Sockets.Socket.DoConnect (エンドポイント endPointSnapshot、SocketAddress socketAddress) で
どうやら、Pervasive データベース エンジンは常にlocalhost
(この場合はサーバー) の IPv6 バージョンを最初に試行し、IPv4 接続にフォールバックして成功する前に失敗します。したがって、成功の幻想は維持されますが、その過程で多くの例外が消費されます。
しかし、私の意見では、試みられた接続ごとに例外を消費しなければならないのは、ただの悪臭です。
これは物事を行う通常の方法ですか?または、IPv6 を無視して IPv4 の使用を強制する方法はありますか? 「Windows でオフにする」で終わる回答は実行できないことに注意してください。これをコードで制御できない場合は、それを我慢するしかありません。
最初の反論は、「クライアントが IPv6 を望んでいる、必要としている、または少なくとも使用できる場合はどうなるか?」というものになると思います。正直なところ、わかりません。ネットワーキングは私の得意分野ではないので、このトピックに関するアドバイスは何でも受け付けます。しかし、IPv6 が利用可能であれば、おそらくそれを使用する必要があるという考えには同意します。
ただし、私が言おうとしている主なポイントは、IPv6 が利用できない場合、私のコードは大量の例外を消費せざるを得ず、それが私を悩ませているということです。
何かを示すために、コードは次のようになります。
private PsqlConnection _connection = new PsqlConnection();
_connection.ConnectionString = String.Format("Server={0};ServerDSN={1}", _serverName, _dbName);
try { _connection.Open(); }
catch (Pervasive.Data.SqlClient.PsqlException ex) { /*write Pervasive-specific error to log*/ }
catch (Exception ex) { /*write generic error to log*/ }
呼び出しの周りのtry
ブロックOpen()
が実際にヒットすることはありません。それは泡立っているようで、私はそれを壊すことができますが、それはより深く処理されます. どちらcatch
も実際にはヒットしません.