26 августа 2013 г.

Как программно сделать запрос к whois-серверу на C#

... и получить ответ. :)

Был у меня старый код, который осуществлял проверку доменного имени и извлекал нужные мне данные по нему.

Это был очень простой код на C#. Он попросту формировал веб-адрес одного сайта, который как раз и предоставлял возможность проверять доменные имена. В строку веб-адреса входило искомое доменное имя.

Код представлялся сайту как обычный браузер и в ответ получал HTML-страницу. Далее код разбирал HTML-код и извлекал нужную информацию, если она там была.

Однако с какого-то времени сайт перестал предоставлять такую услугу и код мой перестал работать. Нужно было менять код. Так как программист из меня так себе, я хотел сохранить подход: формирование веб-адреса и разбор возвращаемой HTML-страницы. Однако другой удобной альтернативы для этого я не нашел.

Поэтому пришлось интересоваться, как на C# сделать запрос к whois-серверу по TCP, чтобы получить нужную о домене информацию. Код я сам не писал, просто нашел в инете уже готовый, и приспособил к своим нуждам. Так как он достаточно универсален, то его можно использовать для запросов к различным whois-серверам.


Вот он:

private string GetWhoisInfo(string domain, string whoisServer, int whoisPort=43)
{
    using (TcpClient tcpClient = new TcpClient(whoisServer, whoisPort))
    {
        string domainInfo = String.Empty;
        if (String.IsNullOrEmpty(domain))
            return domainInfo;

        string domainString = domain + "\r\n";
        byte[] domainAsBytes = Encoding.ASCII.GetBytes(domainString);

        Stream stream = tcpClient.GetStream();
        stream.Write(domainAsBytes, 0, domainString.Length);

        StreamReader streamReader = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
        domainInfo = streamReader.ReadToEnd();

        streamReader.Close();

        tcpClient.Close();

        return domainInfo;
    }
}

Ну, и использование метода, например:

string whoisInfo = GetWhoisInfo("blogspot.com", "whois.networksolutions.com", 43);

или без явного указания порта, если используется дефолтный:

string whoisInfo = GetWhoisInfo("blogspot.com", "whois.networksolutions.com");

Кратенько о моем методе GetWhoisInfo:

Метод принимает 3 параметра:
  • domain - искомое доменное имя, напр. "blogspot.com"
  • whoisServer - адрес whois-сервера, напр. "whois.networksolutions.com"
  • whoisPort - адрес порта сервера для whois-запросов (по умолчанию, 43)
Но вы можете реализовать все по-своему, например, в качестве параметров передавать список серверов, и список доменных имен для проверки.

Запрос мы осуществляем с помощь объекта TcpClient. Доменное имя переводим в требуемый формат. С помощью объекта TcpClient:
  1. делаем запрос, т.е. открываем и пишем в поток (Stream) и 
  2. получаем ответ, т.е. читаем из потока и передаем результат в свой StreamReader, указывая при этом кодировку (в примере - UTF-8).
С кодировкой - отдельная песня и бывает, нужно подобрать правильную для определенного сервера. Можно передавать кодировку в параметре.

Ну, и возвращаем из метода ответ сервера в виде строки.

Можно перед возвратом можно заменить переносы строк на <br/>:

StreamReader streamReader = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
domainInfo = Regex.Replace(streamReader.ReadToEnd(), "\r\n", "<br/>");
streamReader.Close();

... и возвращаемую строку сразу выводить на HTML-странице:

Короче приведенный выше код - это, так сказать, boilerplate, для того, чтобы с чего-то начать, а как вы его уже приспособите под свои нужды - дело ваше.

Комментариев нет:

Отправить комментарий