У меня странная проблема на нескольких клиентских сайтах с Firebird и .net. Я использую Firebird 2.1 и провайдер DDEX для Visual Studio, и я работаю в C #. В частности, я получаю очень общие исключения:
Exception on trying to connect to firebird DB:
FirebirdSql.Data.FirebirdClient.FbException: Unable to complete network request to host "10.206.34.177".
---> FirebirdSql.Data.Common.IscException: Exception of type 'FirebirdSql.Data.Common.IscException' was thrown.
at FirebirdSql.Data.Client.Gds.GdsConnection.Connect(String dataSource, Int32 port, Int32 packetSize, Charset charset)
at FirebirdSql.Data.Client.Gds.GdsDatabase.Attach(DatabaseParameterBuffer dpb, String dataSource, Int32 port, String database)
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
--- End of inner exception stack trace ---
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect()
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.Create()
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckOut()
at FirebirdSql.Data.FirebirdClient.FbConnection.Open()
at Seljax.Database.Firebird.DatabaseManager.TryToConnect()
Мне показалось бы, что это указывает на проблему с сетью, возможно, пожарную стену или что-то в этом роде? И все же я не могу найти блок?
Дополнительная информация (2 разных случая):
Случай 1 (сеть 1):
Компьютер под управлением Windows 7 x64 с пакетом обновления 1. Я настроил firebird для использования порта 5013, и он прекрасно подключается, если указать локальный адрес обратной связи (127.0.0.1). Кроме того, он просто прекрасно подключается к локальному IP-адресу (10.206.34.177), который в настоящее время настроен как сатирический с сетевой маской 255.255.255.192. Однако если я изменю этот компьютер на использование динамического IP-адреса (полученного с сервера DHCP) и попытаюсь подключиться к IP-адресу (в этом случае я получаю маску 10.206.34.184 255.255.255.192), я получаю исключение выше. Насколько я могу судить, я настроил все так же, как сервер DHCP, за исключением использования статического IP-адреса. В дополнение ко всему этому, я попробовал следующее, чтобы он работал с динамическим IP-адресом:
- выключил брандмауэр windows
- отключил Microsoft Secuirty Essentials (защита в режиме реального времени)
- отключил как брандмауэр, так и MSE
- обеспечен минимальный контроль учетных записей
- Отключен IPV6 из конфигурации сети
Насколько я могу судить, сеть настроена так, чтобы не фильтровать какой-либо внутренний сетевой трафик. Я могу нормально проверить связь с локальной системой. У меня есть простая программа, которая открывает сокет для системы с помощью класса TcpClient в c #, и он просто прекрасно подключается к ip и порту, что, я думаю, означает, что соединение с сокетом установлено, что, казалось бы, указывает на то, что оно будет работать.
Обратите внимание, я выглядел как можно лучше, я не смог найти другие антивирусы или брандмауэры, установленные вне Microsoft Security Essential и встроенного брандмауэра.
Итого в убыток, предложения, пожалуйста?
Случай 2 (сеть 2):
Windows 7 x32 компьютер, без SP1. Я оставил порт firebird настроенным на 3050. К этой машине я даже не могу подключиться, используя адрес обратной связи (127.0.0.1). Я пробовал статический, нестатический, отключение IPV6, отключение брандмауэра и отключение MSE. IP для этой машины: 10.200.81.179 маска 255.255.255.192.
Обновление - теперь этот аппарат может подключаться к себе после изменения всех трех машин в сети на использование статических IP-адресов, но появилась новая проблема, перечисленная ниже
Опять же, в полном недоумении, идеи, предложения, пожалуйста?
Еще больше информации:
Я установил сумасшедшую простую тестовую программу, которая имеет 3 текстовых поля, которые я могу заполнить, чтобы подключиться к базе данных, и я убежден, что она работает, как и ожидалось, с запущенным firebird, и если он не запущен, то выдает точно такие же ошибки Я попадаю на машины клинета.
Так, например, вы запускаете службу firebird, запускаете connect, success, закрываете службу, запускаете connect и исключение, указанное выше, и все остальные исключения из FbException будут соответствовать тому из машин, которые я пытаюсь подключиться к.
У меня есть все настройки кода по нажатию кнопки, во всяком случае, для ссылки на код, который вызовет исключение, здесь:
// setup connection
FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
csb.DataSource = firebirdAddress.Text;
csb.Port = Convert.ToInt32(firebirdPort.Text);
csb.Database = firebirdPath.Text;
csb.ServerType = 0;
csb.UserID = "SYSDBA";
csb.Password = "masterkey";
csb.Dialect = 3;
// generate the conneciton object
string connectionString = csb.ToString();
FbConnection connection = new FbConnection(connectionString);
try
{
MessageBox.Show("Trying to connect with string: " + Environment.NewLine + connectionString);
connection.Open();
MessageBox.Show("Firebird connected successfully!");
}
catch ( Exception exception)
{
FbException fireException = (FbException) exception;
for ( int i = 0; i < fireException.Errors.Count; i++ )
{
MessageBox.Show("Class: " + fireException.Errors[i].Class.ToString() + Environment.NewLine +
"Error #" + fireException.Errors[i].Number.ToString() + ": " + fireException.Errors[i].Message + " on line " +
fireException.Errors[i].LineNumber.ToString() );
}
MessageBox.Show("Exception caught: " + Environment.NewLine + exception.ToString());
// loop through all inner exceptions
while ( exception.InnerException != null )
{
MessageBox.Show("Inner exception: " + Environment.NewLine + exception.InnerException.ToString());
exception = exception.InnerException;
}
}
finally
{
connection.Close();
connection = null;
connectionString = null;
csb = null;
}
В любом случае, любые предложения или информация будут очень ценными!
Появилась некоторая дополнительная информация. В случае 1, описанном выше, я успешно могу подключиться к компьютеру с помощью компьютера с Windows XP и кода, показанного выше для подключения.
Windows делает что-то странное с IP-маршрутизацией ??
Обновление:В случае, если компьютер 2 не может подключиться к адресу 127, он был «исправлен», изменив всю машину в сети на использование статического IP-адреса. однако случай 2 стал более интересным. В сенарио три компьютера. Теперь все трое могут "sortof" общаться, так как все они настроены на статические IP-адреса.
Details of communication:
Computer A Computer B Computer C
works works doesn't work Computer A
works works doesn't work Computer B
doesn't work works works Computer C
Очевидным ответом будет поставить сервер на компьютер B и работать с ним, но он не работает с точки зрения логистики, поскольку этот компьютер очень плохой компьютер и редко включен. Обратите внимание, все три работают под управлением Windows 7
Разрешение:
Случай 2 выше, где некоторые компьютеры не могли общаться с другими, и было задействовано 3 машины, оказалось, что в сети было 2 компьютера с одинаковым именем. Мое лучшее предположение состоит в том, что окна, или firebird, или оба, так или иначе, зависят от имени для общения, и дублирующее имя блокировало его.
В случае 1 мы решили использовать только статический IP-адрес. Не уверен, почему это необходимо, но это решает проблему. кроме того, в этой сети есть вторая машина, которая также является Windows 7 и не будет правильно подключаться без статического IP-адреса.