是否有可能强制Pervasive不尝试IPv6连接?

时间:2014-08-27 12:04:30

标签: c# ipv6 ipv4 pervasive pervasive-sql

通过使用分析器,我注意到当我们连接到Pervasive数据库时,引擎总是抛出一个System.Net.Sockets.SocketException,其内容为:

  

无法建立连接,因为目标计算机主动拒绝它:: 1:1583

......它只有这个小堆栈跟踪:

  

at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,SocketAddress socketAddress)

显然,Pervasive数据库引擎总是首先尝试IPv6版本的localhost(在这种情况下是服务器),然后在回退到IPv4连接并成功之前失败。因此保持了成功的幻觉,但在此过程中消耗了许多例外。

但在我看来,不得不为每个尝试连接消耗一个例外,只是简单的臭味。

这是正常的做事方式吗?或者有什么方法可以强制使用IPv4,忽略IPv6?请注意,任何以“在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实际上都没有被击中。

1 个答案:

答案 0 :(得分:2)

在您的连接字符串中,将EnableIPV6设置为false ...

Taken from here... Table 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类型的参数。 “