Wie kann ich den Stammdomänen-URI in ASP.NET abrufen?

95

Angenommen, ich hoste eine Website unter http://www.foobar.com .

Gibt es eine Möglichkeit, programmgesteuert " http://www.foobar.com/ " in meinem Code dahinter zu ermitteln (dh ohne es in meiner Webkonfiguration fest codieren zu müssen)?

Ader
quelle
7
Da dies von der Anforderung abhängt, können Sie versuchen, in das RequestObjekt zu schauen .
John Saunders

Antworten:

79

Mit HttpContext.Current.Request.Url können Sie alle Informationen zur URL abrufen . Und kann die URL in ihre Fragmente zerlegen.

JoshBerke
quelle
4
Ja, warum die Abwahl? Sehen Sie nicht, dass etwas als Antwort markiert und oft herabgestimmt ist. : /
Zack
4
Diese Antwort gefällt mir auch nicht. blesh hat das richtige gegeben und dies hätte als Antwort markiert werden sollen ...
Michal B.
-1 - Request.Url gibt häufig eine URL wie "/ folder1 / folder2" an und schließt die Domain insgesamt aus.
Justin
4
@ Justin: Request.Url gibt dir ein Uri-Objekt, in dem alle Teile für dich zerlegt sind. Es sollte dir keine Schnur geben. Zumindest nicht in der Version von .net, die ich benutze
JoshBerke
6
Diese Antwort könnte verbessert werden, indem der Code hinzugefügt wird, der es funktioniert, wie die Antwort unten, die mehr Stimmen hat ...
theJerm
170
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

Uri :: GetLeftPart Methode :

Die GetLeftPart-Methode gibt eine Zeichenfolge zurück, die den am weitesten links stehenden Teil der URI-Zeichenfolge enthält und mit dem durch part angegebenen Teil endet.

UriPartial Enumeration :

Die Schema- und Berechtigungssegmente der URI.

George
quelle
5
Viel besser als das Parsen von URL!
Evgenyt
1
Das ist die beste Antwort! tnx!
AminM
Dies sollte die ausgewählte Antwort sein. Zu viele nicht benötigte String-Manipulationen.
Ghasan
1
Mit dieser Methode gibt http: // www.lala.xxx/blah/blah http: // www.lala.xxx
live-love
+1 Und nicht dasselbe wie .Authority, die - in den Tests, die ich mit localhost durchgeführt habe - den Protokollteil (http: //) weglässt.
GGleGrand
122

Für alle, die sich noch fragen, finden Sie eine vollständigere Antwort unter http://devio.wordpress.com/2009/10/19/get-absolut-url-of-asp-net-application/ .

public string FullyQualifiedApplicationPath
{
    get
    {
        //Return variable declaration
        var appPath = string.Empty;

        //Getting the current context of HTTP request
        var context = HttpContext.Current;

        //Checking the current context content
        if (context != null)
        {
            //Formatting the fully qualified website url/name
            appPath = string.Format("{0}://{1}{2}{3}",
                                    context.Request.Url.Scheme,
                                    context.Request.Url.Host,
                                    context.Request.Url.Port == 80
                                        ? string.Empty
                                        : ":" + context.Request.Url.Port,
                                    context.Request.ApplicationPath);
        }

        if (!appPath.EndsWith("/"))
            appPath += "/";

        return appPath;
    }
}
Brian Hasden
quelle
4
Hat perfekt funktioniert. Wenn die Site Server ist: 8080 / MySiteName , wird sie korrekt abgerufen .
Michael La Voie
2
Vielen Dank, dass Sie den tatsächlichen Code anstelle eines Links an einer anderen Stelle freigegeben haben.
theJerm
2
context.Request.Url.Port == 80 wird Probleme in HTTPS verursachen
Evgenyt
7
Beachtung! Funktioniert nicht für https. Für https ersetzen müssen context.Request.Url.Port == 80 durch (context.Request.Url.Port == 80 && context.Request.Url.Scheme == "http") || (context.Request.Url.Port == 443 && context.Request.Url.Scheme == "https")oder Verwendung Antwort unten
razon
1
Funktioniert auch für localhost (wenn Sie localy testen). Wenn Sie keinen Port benötigen, können Sie "http: //" + HttpContext.Current.Request.Url.Host verwenden.
CyberHawk
32

Wenn Beispiel-URL http://www.foobar.com/Page1 ist

HttpContext.Current.Request.Url; //returns "http://www.foobar.com/Page1"


HttpContext.Current.Request.Url.Host; //returns "www.foobar.com"


HttpContext.Current.Request.Url.Scheme; //returns "http/https"


HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); //returns "http://www.foobar.com"
Dheeraj Palagiri
quelle
1
Nein Nein. .Hostvon "http://www.foobar.com/Page1"ist www.foobar.comnicht foobar.com.
Tchelidze
1
Ja, Sie haben Recht, aktualisiert die Antwort. @ Tchelidze danke
Dheeraj Palagiri
27
string hostUrl = Request.Url.Scheme + "://" + Request.Url.Host; //should be "http://hostnamehere.com"
Ben Lesh
quelle
16

So erhalten Sie die gesamte Anforderungs-URL-Zeichenfolge:

HttpContext.Current.Request.Url

So erhalten Sie den Teil www.foo.com der Anfrage:

HttpContext.Current.Request.Url.Host

Beachten Sie, dass Sie bis zu einem gewissen Grad Faktoren außerhalb Ihrer ASP.NET-Anwendung ausgeliefert sind. Wenn IIS so konfiguriert ist, dass mehrere oder beliebige Host-Header für Ihre Anwendung akzeptiert werden, wird möglicherweise jede der Domänen, die über DNS in Ihre Anwendung aufgelöst wurden, als Anforderungs-URL angezeigt, je nachdem, welche vom Benutzer eingegeben wurde.

Rex M.
quelle
1
einfachste Lösung hier
full_prog_full
4
Match match = Regex.Match(host, "([^.]+\\.[^.]{1,3}(\\.[^.]{1,3})?)$");
string domain = match.Groups[1].Success ? match.Groups[1].Value : null;

host.com => host.com zurückgeben
s.host.com => host.com zurückgeben

host.co.uk => return host.co.uk
www.host.co.uk => return host.co.uk
s1.www.host.co.uk => return host.co.uk

NQuenault
quelle
Mir ist klar, dass dies ein alter Beitrag ist, aber gut gemacht, NQuenault. Ich bin bei Regex Expressions nicht so gut gemacht. Genau das, was ich brauchte.
JeffreyJ
@nquenault irgendwelche Gedanken darüber, wie man mit einem Hostnamen wie www.abc.com am besten umgeht? Vielen Dank!
Gary Ewan Park
4

- Das Hinzufügen des Ports kann beim Ausführen von IIS Express hilfreich sein

Request.Url.Scheme + "://" + Request.Url.Host + ":" + Request.Url.Port
JonathanC
quelle
3
string domainName = Request.Url.Host
Sk93
quelle
3

Ich weiß, dass dies älter ist, aber der richtige Weg, dies jetzt zu tun, ist

string Domain = HttpContext.Current.Request.Url.Authority

Dadurch wird die DNS- oder IP-Adresse mit Port für einen Server abgerufen.

Müßiggang23
quelle
3

Das funktioniert auch:

string url = HttpContext.Request.Url.Authority;

Fribu - Intelligente Lösungen
quelle
1

C # Beispiel unten:

string scheme = "http://";
string rootUrl = default(string);
if (Request.ServerVariables["HTTPS"].ToString().ToLower() == "on")
{
  scheme = "https://";
}
rootUrl = scheme + Request.ServerVariables["SERVER_NAME"].ToString();
Saul Dolgin
quelle
1
string host = Request.Url.Host;
Regex domainReg = new Regex("([^.]+\\.[^.]+)$");
HttpCookie cookie = new HttpCookie(cookieName, "true");
if (domainReg.IsMatch(host))
{
  cookieDomain = domainReg.Match(host).Groups[1].Value;                                
}
Shawn Constance
quelle
1

Dies gibt genau das zurück, was Sie fragen.

Dim mySiteUrl = Request.Url.Host.ToString()

Ich weiß, dass dies eine ältere Frage ist. Aber ich brauchte die gleiche einfache Antwort und diese gibt genau das zurück, was gefragt wird (ohne http: //).

Tomepenn
quelle