So erhalten Sie den aktuellen Domänennamen in ASP.NET

84

Ich möchte den aktuellen Domainnamen in asp.net c # erhalten.

Ich benutze diesen Code.

string DomainName = HttpContext.Current.Request.Url.Host;

Meine URL lautet localhost:5858aber nur localhost.

Jetzt verwende ich mein Projekt in localhost. Ich möchte localhost bekommen: 5858.

Ein anderes Beispiel, wenn ich diese Domain verwende

www.somedomainname.com

ich möchte bekommen somedomainname.com

Bitte geben Sie mir eine Idee, wie Sie den aktuellen Domainnamen erhalten.

Jatin Gadhiya
quelle
1
Hostname und Domainname sind zwei verschiedene Dinge. Möchten Sie eine Domain, die Ihrer spezifischen IP-Adresse oder dem Hostnamen des Computers zugeordnet ist, auf dem sie ausgeführt wird?
Rob Goodwin
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad

Antworten:

79

Die Verwendung Request.Url.Hostist angemessen - auf diese Weise rufen Sie den Wert des HTTP- Host:Headers ab, der angibt, welchen Hostnamen (Domänennamen) der UA (Browser) wünscht, da der Ressourcenpfadteil der HTTP-Anforderung den Hostnamen nicht enthält.

Beachten Sie, dass localhost:5858es sich nicht um einen Domänennamen handelt, sondern um einen Endpunktspezifizierer, der auch als "Berechtigung" bezeichnet wird und den Hostnamen und die TCP-Portnummer enthält. Dies wird durch Zugriff abgerufen Request.Uri.Authority.

Darüber hinaus ist es nicht gültig zu bekommen somedomain.comaus , www.somedomain.comweil ein Webserver einen anderen Standort konfiguriert werden könnte , dienen , www.somedomain.comum im Vergleich somedomain.com, aber wenn Sie sind sicher , dass dies in Ihrem Fall gültig ist , dann werden Sie manuell die Hostnamen analysieren müssen, obwohl mit String.Split('.')Werken in eine Prise.

Beachten Sie, dass sich die Webserverkonfiguration (IIS) von der Konfiguration von ASP.NET unterscheidet und dass ASP.NET die HTTP-Bindungskonfiguration der Websites und Webanwendungen, unter denen es ausgeführt wird, überhaupt nicht kennt. Die Tatsache, dass sowohl IIS als auch ASP.NET dieselben Konfigurationsdateien ( web.config) verwenden, ist ein roter Hering.

Dai
quelle
118

Versuchen Sie, den "linken Teil" der URL wie folgt abzurufen:

string domainName = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);

Dies gibt Ihnen entweder http://localhost:5858oder https://www.somedomainname.comob Sie vor Ort oder in der Produktion sind. Wenn Sie das wwwTeil löschen möchten , sollten Sie IIS dafür konfigurieren, aber das ist ein anderes Thema.

Beachten Sie, dass die resultierende URL keinen abschließenden Schrägstrich enthält.

Arturo Torres Sánchez
quelle
7
Dies sollte meiner Meinung nach die beste Antwort sein.
Andrew
Dies funktionierte hervorragend für meine Bedürfnisse. Eine kleine Korrektur: Wenn Sie den Authority-Teil anfordern, enthält die zurückgegebene Zeichenfolge kein Trennzeichen für den nachfolgenden Pfad. Also:http://localhost:60333
Will
1
var base_url = "@ Request.Url.GetLeftPart (UriPartial.Authority) @ Url.Content (" ~ / ")"
Prince Prasad
Dies scheint unter Asp.Net Core 2.2 nicht zu funktionieren. Ich erhalte 'HttpContext' enthält keine Definition für 'Current' und es kann keine zugängliche Erweiterungsmethode 'Current' gefunden werden, die ein erstes Argument vom Typ 'HttpContext' akzeptiert (fehlt Ihnen eine using-Direktive oder eine Assembly-Referenz?).
Stian
@Stian Anscheinend gibt es bereits einen anderen Beitrag, der darauf antwortet: stackoverflow.com/questions/31243068/… . Diese Antworten konzentrieren sich nur auf den URI-Teil.
Arturo Torres Sánchez
41

Hier ist ein Screenshot Request.RequestUriund alle seine Eigenschaften als Referenz für alle.

Geben Sie hier die Bildbeschreibung ein

ThiagoPXP
quelle
18

Sie können den folgenden Code ausprobieren:

 Request.Url.Host +
    (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port)
Rajeev Mehta
quelle
6

www.somedomain.com ist die Domain / der Host. Die Subdomain ist ein wichtiger Teil. www.wird oft synonym mit nicht vorhanden verwendet, aber das muss in der Regel eingerichtet werden (auch wenn es standardmäßig festgelegt ist), da sie nicht gleichwertig sind. Denken Sie an eine andere Subdomain wie mx.. Das hat wahrscheinlich ein anderes Ziel als www..

Angesichts dessen würde ich raten, so etwas nicht zu tun. Das heißt, da Sie fragen, stelle ich mir vor, Sie haben einen guten Grund.

Persönlich würde ich dafür ein spezielles Gehäuse vorschlagen www..

string host = HttpContext.Current.Request.Url.GetComponents(UriComponents.HostAndPort, UriFormat.Unescaped);;

if (host.StartsWith("www."))
    return host.Substring(4);
else
    return host;

Andernfalls benötigen Sie etwas Komplizierteres , wenn Sie wirklich zu 100% sicher sind, dass Sie eine Subdomain abschneiden möchten .

string host = ...;

int lastDot = host.LastIndexOf('.');

int secondToLastDot = host.Substring(0, lastDot).LastIndexOf('.');

if (secondToLastDot > -1)
    return host.Substring(secondToLastDot + 1);
else
    return host;

Den Hafen zu bekommen ist genau wie andere Leute gesagt haben.

Matthew Haugen
quelle
1

HttpContext.Current.Request.Url.Host gibt die richtigen Werte zurück. Wenn Sie es auf www.somedomainname.com ausführen, erhalten Sie www.somedomainname.com. Wenn Sie auch den 5858 erhalten möchten, müssen Sie ihn verwenden

HttpContext.Current.Request.Url.Port 
artm
quelle
1

Das Request.ServerVariablesObjekt funktioniert für mich. Ich kenne keinen Grund, es nicht zu benutzen.

ServerVariables["SERVER_NAME"]und ServerVariables["HTTP_URL"]sollte bekommen, wonach Sie suchen

PJ Leirer
quelle
1

Sie können den folgenden Code ausprobieren, um einen vollständig qualifizierten Domainnamen zu erhalten:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
Yogesh Patel
quelle
4
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Dr. Rob Lang
1

Hier ist eine schnelle und einfache Möglichkeit, den Namen der URL abzurufen.

            var urlHost = HttpContext.Current.Request.Url.Host;

            var xUrlHost = urlHost.Split('.');
            foreach(var thing in xUrlHost)
            {
                if(thing != "www" && thing != "com")
                {
                    urlHost = thing;
                }
            }
dstineback
quelle
0

Versuche dies:

@ Request.Url.GetLeftPart (UriPartial.Authority)

Hiren Patel
quelle
In dieser Antwort wird nicht näher erläutert, warum dies funktioniert, und sie ist tatsächlich mit einer der vorhandenen Antworten identisch.
Arturo Torres Sánchez
-1

So erhalten Sie die Basis-URL in MVC auch mit Subdomain www.somedomain.com/subdomain:

var url = $"{Request.Url.GetLeftPart(UriPartial.Authority)}{Url.Content("~/")}";
Ivan-San
quelle