0

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

由于目标机器主动拒绝连接,无法建立连接 ::1:1583

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

在 System.Net.Sockets.Socket.DoConnect(端点 endPointSnapshot,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实际上都没有被击中。

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 回答