2012-08-06 16 views
19

Gibt es einen Weg in C# zu überprüfen, ob die App auf localhost läuft (im Gegensatz zu einem Produktionsserver)?Wie überprüft man, ob localhost

Ich schreibe ein Massenmail-Programm, das eine bestimmte Mail-Warteschlange verwenden muss, wenn es auf localhost läuft.

if (Localhost) 
{ 
Queue = QueueLocal; 
} 
else 
{ 
Queue = QueueProduction; 
} 
+12

Ein Web-App auf localhost läuft immer :) –

+2

Warum nicht eine Art von Konfiguration verwenden -basierter Wert, der die richtige Warteschlange angibt? –

+0

Es wird ausgeführt, wo es zugewiesen wurde, wenn Sie nichts über Backend wissen, dann können Sie nicht finden, wo die Anwendung ausgeführt wird. Jedoch muss jede laufende Anwendung ein eigenes System haben, das als localhost bekannt ist. – perilbrain

Antwort

18

Wert in der Anwendungskonfigurationsdatei verwenden, die Ihnen sagen, welche Umgebung Sie sind.

Da Sie asp.net verwenden, können Sie config file transforms verwenden, um sicherzustellen, dass die Einstellung für jede Ihrer Umgebungen korrekt ist. Siehe

+0

Interessant, aber ich glaube nicht, dass ich Variablen in einer web.config speichern könnte, kann ich ? Im Augenblick ist der Pfad zur Mail-Warteschlange eine Zeichenfolge innerhalb des Mailer-Dienstes. – user547794

+1

@ user547794 - 'web.config' dreht sich alles um Variabilität. Und ich habe mit der config transform-Dokumentation verlinkt. Ich schlage vor, das zu lesen, damit Sie sehen können, wie viel Sie tun können. – Oded

32

Was ist so etwas wie:

public static bool OnTestingServer() 
    { 
     string host = HttpContext.Current.Request.Url.Host.ToLower(); 
     return (host == "localhost"); 
    } 
+1

Obwohl wir uns das Gesamtbild ansehen, ist die Lösung von Oded wahrscheinlich das, worauf ich mich mehr stütze, als nur den lokalen Host zu überprüfen. – ToddBFisher

+27

Request.Url.Host kann etwas anderes zurückgeben, wie 127.0.0.1. Just tun HttpContext.Current.Request.IsLocal – mhenry1384

+1

ist es besser, Abhängigkeit zu HttpContext zu vermeiden, wenn Sie Ihren Code IIS-unabhängig wollen ... – abzarak

15

wenn dies funktioniert:

public static bool IsLocalIpAddress(string host) 
{ 
    try 
    { // get host IP addresses 
    IPAddress[] hostIPs = Dns.GetHostAddresses(host); 
    // get local IP addresses 
    IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); 

    // test if any host IP equals to any local IP or to localhost 
    foreach (IPAddress hostIP in hostIPs) 
    { 
     // is localhost 
     if (IPAddress.IsLoopback(hostIP)) return true; 
     // is local address 
     foreach (IPAddress localIP in localIPs) 
     { 
     if (hostIP.Equals(localIP)) return true; 
     } 
    } 
    } 
    catch { } 
    return false; 
} 

Referenz: http://www.csharp-examples.net/local-ip/

6

Localhost IP-Adresse ist konstant, können Sie es, wenn Es ist localhost oder Remote-Benutzer bestimmt, verwenden können.

Aber Vorsicht, wenn Sie im Produktionsserver angemeldet sind, wird es auch als localhost betrachtet.

Dies umfasst IP v.4 und V. 6:

public static bool isLocalhost() 
{ 
    string ip = System.Web.HttpContext.Current.Request.UserHostAddress; 
    return (ip == "127.0.0.1" || ip == "::1"); 
} 

Um völlig sicher zu sein, in welchem ​​Server der Code an ausgeführt wird, können Sie die MAC-Adresse verwenden:

public string GetMACAddress() 
{ 
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
    String sMacAddress = string.Empty; 
    foreach (NetworkInterface adapter in nics) 
    { 
     if (sMacAddress == String.Empty)// only return MAC Address from first card 
     { 
      IPInterfaceProperties properties = adapter.GetIPProperties(); 
      sMacAddress = adapter.GetPhysicalAddress().ToString(); 
     } 
    } return sMacAddress; 
} 

aus : http://www.c-sharpcorner.com/uploadfile/ahsanm.m/how-to-get-the-mac-address-of-system-using-Asp-NetC-Sharp/

Und vergleichen Sie mit einer MAC-Adresse in web.config zum Beispiel.

public static bool isLocalhost() 
{ 
    return GetMACAddress() == System.Configuration.ConfigurationManager.AppSettings["LocalhostMAC"].ToString(); 
} 
0

Dies funktioniert für mich:

public static bool IsLocal 
{ 
    // MVC < 6 
    get { return HttpContext.Request.Url.Authority.Contains("localhost"); } 
    // MVC 6 
    get { return HttpContext.Request.Host.Contains("localhost"); } 
} 

Wenn Sie nicht tun dies in der Controller fügen Sie dann Current nach HttpContext sind, wie in HttpContext.Current.Request...

Auch in MVC 6, in die View, HttpContext ist nur Context

+0

'.Contains (" localhost ")' ist keine gute Lösung, da der Hostname _mylocalhost_ sein kann. Besser nach '==" localhost "sehen' –

+0

Was ist, wenn der Host tatsächlich 'localhost: 1234' ist? –

+0

Sie haben Recht "Request.Url.Authority" [MSDN] (https://msdn.microsoft.com/en-us/library/system.uri.Authority (v = vs.110) .aspx) gibt Host zurück: Port, aber 'Request.Url.Host' [MSDN] (https://msdn.microsoft.com/en-us/library/system.uri.host (v = vs.110) .aspx) - nur Host. So 'return String.Compare (HttpContext.Request.Url.Host," localhost ", StringComparison.OrdinalIgnoreCase);' ist die richtige Antwort, wenn Sie nicht mit Loopback-IP's beschäftigen –

0

Oder könnten Sie eine C# Preprocessor Directive verwenden, wenn Ihr einfach eine Entwicklungsumgebung Targeting (dies Ihre Anwendung im Debug läuft nicht in Produktion geht davon aus!):

#if debug 
Queue = QueueLocal; 
#else 
Queue = QueueProduction; 
36

Als comment hat die richtige Lösung, die ich bin geht es als eine Antwort zu schreiben:

HttpContext.Current.Request.IsLocal 
1

wie folgt aus:

HttpContext.Current.Request.IsLocal

0

Leider gibt es keine HttpContext.HttpRequest.IsLocal() mehr im Kern.

aber nach den original implementation in .Net Kontrolle, ist es ganz einfach, das gleiche Verhalten neu zu implementieren HttpContext.Connection durch Überprüfung:

private bool IsLocal(ConnectionInfo connection) 
{ 
    var remoteAddress = connection.RemoteIpAddress.ToString(); 

    // if unknown, assume not local 
    if (String.IsNullOrEmpty(remoteAddress)) 
     return false; 

    // check if localhost 
    if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
     return true; 

    // compare with local address 
    if (remoteAddress == connection.LocalIpAddress.ToString()) 
     return true; 

    return false; 
} 
Verwandte Themen