2010-03-12 5 views
4

В этом проблема. Пользователь может ввести имя сервера и строку подключения для базы данных. Если сервер недоступен (неправильный адрес, брандмауэры или любая другая проблема), я хочу знать об этом как можно быстрее.Проверьте, существует ли сервер

Если я использую sqlConnection и пытаюсь подключиться к незащищенному серверу, это занимает очень много времени (я думаю, более 1 минуты!). Это не имеет никакого отношения к тайм-ауту соединения btw, поэтому установка этого свойства не поможет.

Моя идея - сначала попробовать сервер ping, и если я получу отклик (что означает, что сервер доступен с точки приложения), чем приступить к sqlConnection. Если ответа от пинга нет, операция прерывается, и пользователь уведомляется о нем надлежащим образом.

Есть ли лучший способ сделать это? Любая идея будет приветствоваться.

Забыл указать, я использую NHibernate, поэтому я не могу использовать какую-либо конкретную библиотеку MSSQL. Кроме того, целевой сервер может иметь ОС Linux, а не только Windows.

ответ

4

Это previous question's answer has a decent approach, что более элегантно, что просто пинг, с помощью WMI даст вам больше информации в целом

+0

Это было бы предположить, что существует операционная система Windows на системы наведения, не так ли? Если это так, я не могу использовать этот подход. – buhtla

+0

, это было бы очень верно, это полностью ориентировано на Windows ... поскольку подход для mysql на linux, скорее всего, был бы совершенно иным, чем оракул на окнах или любой другой комбинации. – curtisk

1

Я думаю, что его стоит отметить, что только действительно хороший способ, чтобы проверить наличие родовых баз данных и доступность к нему доступу , Машина может быть сконфигурирована с отлично функционирующей базой данных и, например, отказываться от писем. Аналогично, машина может запускать экземпляр БД и быть настроена так, чтобы игнорировать/отклонять все запросы WMI. Если вы можете предположить для своей среды, что это неверно (т. Е. Вы знаете, что все ваши компании машины всегда будут отвечать на запросы), вы можете продолжить; в противном случае вам может потребоваться просто нажать «попытка подключения».

+0

На данный момент я близок к тому, чтобы воспринимать ping как хорошее достаточно решения.Конечно, я знаю, что это не пуленепробиваемое решение, поэтому я надеюсь, что есть еще один способ достичь моей цели. Я не могу делать какие-либо предположения относительно среды развертывания, операционной системы или базы данных сервера, поэтому мне нужен общий метод определения присутствия сервера. – buhtla

1

Вы можете использовать SqlDataSourceEnumerator для получения DataTable со всеми доступными SQLServers, а затем проверить вход пользователей в список. Что-то вроде этого. See MSDN.

System.Data.DataTable table = VisibleServerList.GetVisibleServers(); 

public static class VisibleServerList 
{ 
    public static System.Data.DataTable GetVisibleServers() 
    { 
     System.Data.Sql.SqlDataSourceEnumerator instance = System.Data.Sql.SqlDataSourceEnumerator.Instance; 
     return instance.GetDataSources(); 
    } 
} 
+0

В этом приложении, которое у меня есть, я использую NHibernate для ORM, поэтому меня не интересуют только серверы MSSQL. – buhtla

0

При создании подключения к серверу, установите тайм-аут соединения с чем-то вроде 2 или 3 секунды. Таким образом, он будет выручаться намного быстрее, если сервер на самом деле отсутствует.

Единственный недостаток - если сервер существует, и он забит, то вы можете получить ложный отрицательный результат. Но это редко бывает проблемой.

+0

Как я писал в своем оригинальном посте, установка тайм-аута соединения помогает только в том случае, если сервер существует. Если приложение не имеет доступа к серверу (по какой-либо причине - например, неверное имя сервера или брандмауэр), тайм-аут подключения не влияет на продолжительность попытки подключения. – buhtla

0

В конце концов, я решил принять гибридный подход. Когда пользователь нажимает кнопку «Подключиться», пинг будет выполняться на входе пользователя сервера. Если на сервере нет ответа (который может быть обнаружен очень быстро), пользователь получит сообщение о том, что сервер кажется недоступным, и вопрос, если он хочет продолжить и попытаться подключиться к этому серверу.

В принципе, пользователь решит, что он будет ждать «попытки подключения».

0

Вы могли бы просто использовать класс TcpClient для запроса к серверу и проверить, если определенный порт открыт, может быть что-то вроде этого:

using System.Net; 
using System.Net.Sockets; 

public bool CheckServerAvailablity(string serverIPAddress, int port) 
{ 
    try 
    { 
    IPHostEntry ipHostEntry = Dns.Resolve(serverIPAddress); 
    IPAddress ipAddress = ipHostEntry.AddressList[0]; 

    TcpClient TcpClient = new TcpClient(); 
    TcpClient.Connect(ipAddress , port); 
    TcpClient.Close(); 

    return true; 
    } 
    catch 
    { 
    return false; 
    } 
} 
Смежные вопросы