System.Net.Sockets.SocketException (10048): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Пытаюсь с помощью http запросов брать данные из БД (postgresql), которая развёрнута на выделенном сервере (подключаюсь к нему по ssh в самом коде).
Все это дело реализовано с помощью EntityFramework.
Проблема в том, что при запуске проекта, в первый раз запрос работает отлично (проверяю через swagger и postman), но когда пытаюсь выполнить его второй раз, то вылетает ошибка (System.Net.Sockets.SocketException (10048): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)).
Думаю, что дело в коде, который я запихнул в конструктор наследуемого класса от DbContext. Сам код:
SshClient client = new SshClient("айпишник", "пользователь", "пароль");
ForwardedPortLocal port = new ForwardedPortLocal("127.0.0.1", 5432, "127.0.0.1", 5432);
client.Connect();
client.AddForwardedPort(port);
port.Start();
Предполагаю проблема в том, что при первом запросе открывается ssh соединение и не закрывается, а при втором запросе пытается опять его открыть, но выдает ошибку, так как оно уже открыто.
Пытался очень долго это исправить, но возможно мои предположения не верны, или пытаюсь исправить не то.
Ответы (1 шт):
Ну, если бы это было собеседование - Вас бы стали настойчиво спрашивать про синглтон :-)
А так- вроде можно подкорректировать код так, чтобы он просто если соедиенние уже открыто - не пытался открывать его второй раз.
Как вариант - объявить объекты port и client с модификатором static, а в коде класса, наследуемого от DBContext - проверять
if (client==null)
{
client = new SshClient("айпишник", "пользователь", "пароль");
port = new ForwardedPortLocal("127.0.0.1", 5432, "127.0.0.1", 5432);
client.Connect();
client.AddForwardedPort(port);
port.Start();
}
По моему, должно сработать.