it-swarm.com.de

Was ist die beste Methode in ASP.NET, um die aktuelle Domäne abzurufen?

Ich frage mich, wie die aktuelle Domain am besten in ASP.NET abgerufen werden kann.

Zum Beispiel:

http://www.domainname.com/subdir/ sollte http://www.domainname.comhttp: //www.domainname .com/subdir / sollte http://domainname.com ergeben

Als Leitfaden sollte es mir möglich sein, eine URL wie "/Ordner/Inhalt/Dateiname.html" (etwa wie von Url.RouteUrl () in ASP.NET MVC generiert) direkt in die URL einzufügen, und sie sollte funktionieren.

98
Matt Mitchell

Gleiche Antwort wie bei MattMitchell, jedoch mit einigen Änderungen. Dadurch wird stattdessen nach dem Standardport gesucht.

Bearbeiten: Syntax aktualisiert und mit Request.Url.Authority wie vorgeschlagen

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
180
Carlos Muñoz

Gemäß dieser Link ist ein guter Ausgangspunkt:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

Wenn die Domain jedoch http://www.domainname.com:5 lautet, schlägt dies fehl.

Etwas wie das Folgende ist verlockend, um dies zu lösen:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

Port 80 und 443 hängen jedoch von der Konfiguration ab.

Als solches sollten Sie IsDefaultPort wie in der Accepted Answer oben von Carlos Muñoz verwenden.

37
Matt Mitchell
Request.Url.GetLeftPart(UriPartial.Authority)

Dies ist im Schema enthalten.

28
izlence

ACHTUNG! Für alle, die Current.Request . Url.Host verwenden. Verstehen Sie, dass Sie auf der Grundlage der AKTUELLEN ANFRAGE arbeiten und dass die aktuelle Anfrage nicht IMMER auf Ihrem Server und manchmal auch auf anderen Servern eingeht.

Wenn Sie dies also in so etwas wie Application_BeginRequest () in Global.asax verwenden, ist dies in 99,9% der Fälle in Ordnung, aber in 0,1% erhalten Sie möglicherweise etwas anderes als den Hostnamen Ihres eigenen Servers.

Ein gutes Beispiel dafür ist etwas, was ich vor kurzem entdeckt habe. Mein Server schlägt von Zeit zu Zeit http://proxyjudge1.proxyfire.net/fastenv . Application_BeginRequest () bearbeitet diese Anfrage gerne. Wenn Sie also Request.Url.Host anrufen, erhalten Sie proxyjudge1.proxyfire.net zurück. Einige von Ihnen denken vielleicht "no duh", aber es ist erwähnenswert, weil es ein sehr schwerer Fehler war, der zu bemerken ist, da er nur in 0,1% der Fälle auftrat: P

Dieser Fehler hat mich gezwungen, meinen Domain-Host als String in die Konfigurationsdateien einzufügen.

19
Thirlan

Warum nicht benutzen

Request.Url.Authority

Es gibt die gesamte Domain UND den Port zurück.

Sie müssen immer noch http oder https angeben

13
Korayem

Einfach und Kurz (unterstützt Schema, Domain und Port):

Verwenden Sie Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com
2
RAM

Wie wäre es mit:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];
1
Derek Lawless

Ein anderer Weg:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
1
user280429

Verwenden von UriBuilder:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();
0
Darren