通过使用分析器,我注意到当我们连接到 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
实际上都没有被击中。