Условия ошибки Dns.GetHostEntry и методы разрешения - PullRequest
12 голосов
/ 04 февраля 2011

У меня очень специфическая проблема, связанная с Dns.GetHostEntry:

Служба использует Dns.GetHostEntry для получения всех IP-адресов хоста, используя имя хоста. Это всегда работало нормально. При запросе определенных хостов Dns.GetHostEntry выдает ошибку «такой хост не известен». Проблема возникает только при попытке разрешить хосты, которые находятся в другом домене, чем машина, на которой установлена ​​служба. Служба работала в течение достаточно долгого времени, но в последнее время перестала работать, выдав ошибку «такой узел не известен» (к сожалению, трассировка стека недоступна). Nslookup работает, хотя, нет проблем там. Данный сервис написан на VB.NET и предназначен для .NET Framwork 2.0.

Комментарии в записи MSDN для .NET 3.0 (http://msdn.microsoft.com/en-us/library/ms143998(v=VS.85).aspx указывают на то, что может быть проблема с обратными записями DNS для хостов, но я не смог воспроизвести проблему в тестовой сети, даже со всеми удаленными зонами обратного просмотра (есть больше комментариев для других версий .NET, все с похожими проблемами). [EDIT:] Даже намеренное добавление неверной записи PTR не приводит к возникновению проблемы на моем тестовом компьютере.

[EDIT2:] Единственное, что вызвало ошибку, было отключение сетевого адаптера и, следовательно, отключение DNS-сервера, даже несмотря на то, что прямое разрешение все еще работало из-за кэширования.

Итак, мои вопросы:

  1. При каких условиях GetHostEntry генерирует эту конкретную ошибку?
  2. Какие методы разрешения он использует? Если я не ошибаюсь, он использует неуправляемую функцию WinSock getnameinfo (http://msdn.microsoft.com/en-us/library/ms738532(v=vs.85).aspx),: "Разрешение имен может осуществляться Системой доменных имен (DNS), локальным файлом hosts, или другими механизмами именования".
  3. Есть идеи, почему это внезапно завершается неудачей для машин в другом домене (но не для машин в том же домене)?

Спасибо и всего наилучшего, cun83

1 Ответ

7 голосов
/ 29 ноября 2011

Лично я всегда использую Dns.GetHostAddresses . Это всегда дает мне надежный результат.

Относительно того, почему Dns.GetHostEntry выдает указанную ошибку, я думаю, это связано с тем, что DnsGetHostEntry попытается выполнить обратный поиск DNS перед возвратом вам IP-адреса , Если обратный поиск DNS не удастся, он даст вам «такой хост не известен».

Насколько я знаю, Dns.GetHostAddresses просто возвращает IP-адрес.

...