0

プロファイラーを使用することで、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も実際にはヒットしません.

4

1 に答える 1

2

接続文字列で、EnableIPV6 を false に設定します...

ここから抜粋... 表 27 「IPv4 アドレスを使用して Pervasive Server に接続するための下位互換性を提供します。

True に設定すると、IPv6 プロトコルがインストールされているクライアントは、IPv4 アドレスまたは IPv6 アドレスのいずれかを使用して、サーバーに対して自身を識別できます。

False に設定すると、クライアントは下位互換モードで実行されます。クライアントは常に、IPv4 アドレスを使用してサーバーに対して自身を識別します。

4.0 のデフォルト値は True に設定され、3.5 のデフォルト値は False に設定されています。このオプションは 3.2 では無効です

VPN を使用して Pervasive Server に接続するユーザーが、追加のライセンスを使用したクレジットを取得しないようにするために、Pervasive は Data Provider 3.5 のユーザーが EnableIPv6 を True に設定することを推奨します。"

更新: InfoMessage イベントを調べましたか?... " PsqlConnection オブジェクトの InfoMessage イベントを使用して、データベースから警告および情報メッセージを取得できます。データベースがエラーを返した場合、例外がスローされます。

データベース サーバーから送信された警告および情報メッセージを処理するクライアントは、PsqlInfoMessageEventHandler デリゲートを作成して、このイベントに登録する必要があります。

InfoMessage イベントは、このイベントに関連するデータを含む PsqlInfoMessageEventArgs 型の引数を受け取ります。"

于 2014-08-27T12:18:08.803 に答える