2013-03-16 10 views
7

Mam problem, w którym moje żądania sieci .NET zawsze trafiają na ten sam adres IP dla danego rekordu CNAME. Nazwa CNAME jest powiązana z wieloma adresami IP, a te adresy IP są zwracane w losowej kolejności za każdym razem, gdy następuje wyszukiwanie DNS (potwierdzone przez uruchomienie programu nslookup)..NET buforuje DNS na zawsze w Server 2008

napisałem prostą aplikację do testowania to:

public void TestDNS() 
    { 
     while (true) 
     { 
      var ipAddress = Dns.GetHostAddresses("mywebsite.com").First().ToString(); 

      Console.WriteLine(string.Format("Current: '{0}' at: '{1}'", ipAddress, DateTime.Now.ToLongTimeString())); 

      Thread.Sleep(1000); 
     } 
    } 

mam uruchomić tę aplikację na Server 2008 Datacenter Server 2008 R2 Datacenter Server 2012, Windows 7 i Windows 8. Wszystkie maszyny miał najnowszy aktualizacje i dodatki Service Pack są dostępne.

Jedynym urządzeniem, które zawiedzie, jest Serwer 2008. Każde inne urządzenie przełącza adres IP mniej więcej raz na minutę (TTL wynosi 1 minutę). Serwer 2008 nigdy się nie przełącza (działa przez ponad godzinę).

Aby być czystym, działające narzędzie nslookup i inne narzędzia na maszynie wydają się wskazywać, że DNS zwraca dokładnie to, czego oczekiwałbym. Ten problem wydaje się być specyficzny dla platformy .NET na serwerze 2008.

Próbowałem pozycji wymienionych w tym powiązanym answer bez powodzenia.

Wszelkie pomysły?

+0

można mieć Serwer DNS powrotną zupełnie inny zestaw adresów IP dla każdego połączenia?Dzięki temu dowiesz się, czy elementy są buforowane, czy też z jakiegoś powodu środowisko wykonawcze sortuje właśnie zwracane wartości. –

+0

Dobry pomysł @ JimMischel. Próbowałem zmienić rekord DNS po uruchomieniu aplikacji .NET i nic się nie zmieniło. Wygląda na to, że nie wykrył on żadnych zmian w DNS (tj. Na zawsze buforowanych). Jedyną rzeczą, którą znalazłem, jest aktualizacja pliku hosts. Jeśli to zrobię, aktualizuje DNS w działającej aplikacji .NET. – manu08

+0

Metoda GetHostAddresses() zwraca tablicę typu IPAddress. Zobacz moją odpowiedź. –

Odpowiedz

2

jako obejście problemu, czy raport ping jest identyczny z tym samym problemem?

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

jeśli byś zaakceptować obejścia, innym możliwym rozwiązaniem byłoby poszukiwanie 3rd party Library/kodu rozwiązać hosta lub powoływać się wiersz poleceń poprzez [System.Diagnostics.Process();].

nadzieję, że to pomoże.

+0

Dzięki. Obejście, które teraz zrobiłem, wywołuje metodę wslookup za pomocą komendy procesu .NET i aktualizuje plik hosts. To hack, ale jest prosty i działa. Ostatecznie uaktualniam się do serwera 2012, który nie ma tego problemu. – manu08

+0

Dobrze wiedzieć, że aktualizacja systemu operacyjnego będzie najlepszym rozwiązaniem. –

+0

Oto kod, w zasadzie przyjmuje docelowy adres URL i przypisuje IP do tylu hostów w pliku hosts, jak tylko chcesz. https://github.com/reustmd/HostFileUpdater/tree/master/HostFileUpdater – manu08

0

Czy używasz tego samego środowiska .NET na wszystkich maszynach, czyli kod jest kompilowany do tego samego celu (x86 lub x64), a tym samym .NET Framework 2.0 lub 3.5 lub 4.0

+0

Tak. Kopiowałem i wklejałem pliki EXE i DLL do różnych komputerów. Każdy system operacyjny był 64-bitowy. – manu08

+1

Zakładam, że nie oznacza to, że wszystkie mają ten sam framework http://stackoverflow.com/questions/7084028/can-net-2-0-assemblies-run-under-net-4-0 –

+0

tak czy inaczej uważam że jest to błąd w strukturze frameworka .Net, który powinien zostać zgłoszony firmie Microsoft, ale nie ma portalu zgłaszania błędów :( –

3

Metoda GetHostAddresses() zwraca tablicę typ IPAddress.

Return Value

Typ: System.Net.IPAddress []

Tablica typu adres IP, który przechowuje adresy IP dla hosta , który jest określony przez parametr hostNameOrAddress.

Zmień swoją var na tablicę adresów IP. Oto przykład:

public static void DoGetHostAddresses(string hostname) 
{ 
    IPAddress[] ips; 

    ips = Dns.GetHostAddresses(hostname); 

    Console.WriteLine("GetHostAddresses({0}) returns:", hostname); 

    foreach (IPAddress ip in ips) 
    { 
     Console.WriteLine(" {0}", ip); 
    } 
} 

Aby uzyskać więcej informacji, zobacz artykuł this page.

1

Tworzysz zapytania rekurencyjne. Jeśli nie chcesz, aby serwer DNS cache wszelkie zapytania rekurencyjne utworzyć nową wartość DWORD "MaxCacheTTL" o wartości 0x0 w

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ DNS \ Parameters