Wie kann ich die Basis der Website erhalten?

183

Ich möchte eine kleine Hilfsmethode schreiben, die die Basis-URL der Site zurückgibt. Folgendes habe ich mir ausgedacht:

public static string GetSiteUrl()
{
    string url = string.Empty;
    HttpRequest request = HttpContext.Current.Request;

    if (request.IsSecureConnection)
        url = "https://";
    else
        url = "http://";

    url += request["HTTP_HOST"] + "/";

    return url;
}

Gibt es einen Fehler, an den Sie denken können? Kann jemand dies verbessern?

Jaggu
quelle

Antworten:

324

Versuche dies:

string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + 
    Request.ApplicationPath.TrimEnd('/') + "/";
Frank Allenby
quelle
13
Dies ist die einzige Antwort, die ich gefunden habe und die sich mit dem Fall befasst, dass eine Site eine Anwendung ist, die ein Kind einer Top-Level-Website in IIS ist.
John
6
string.Format ("{0} {1} /", Request.Url.GetLeftPart (UriPartial.Authority), Request.ApplicationPath.TrimEnd ('/'))
diegohb
2
Request.Url.Scheme funktioniert nicht immer, wenn Sie internes http konfiguriert und die SSL-Beendigung für https intern auf einem Server eingerichtet haben, aber https * außerhalb ausführen. Um dies zu umgehen, habe ich einfach einen umgebungsspezifischen AppSetting-Schlüssel "UrlScheme" mit dem Wert "http" oder "https" erstellt, je nachdem, wo sich die Website befindet. Auf diese Einstellung in der web.config kann von ConfigurationManager.AppSettings ["Key"] zugegriffen werden
Ben Sewards
3
Dies berücksichtigt nicht den Lastenausgleich, bei dem die Entschlüsselung erfolgt, oder die Weiterleitung von Proxys. Sie können damit eine falsche Adresse erhalten. Seien Sie also vorsichtig und wissen Sie, wo Ihre Website bereitgestellt wurde.
Conor Gallagher
$ "{System.Web.HttpContext.‌ Current.Request.Url.GetLeftPart (UriPartial.Authority)} {System.Web.HttpContext.Cur‌ rent.Request.ApplicationPath? .TrimEnd ('/')} /";
Ryan Penfold
166
string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority)

Das ist es ;)

Hexenmeister
quelle
25
Dies funktioniert nicht für den virtuellen Pfad oder den Anwendungspfad. Sie sollten zusätzlich zum linken Teil Request.ApplicationPath verwenden.
Hexenmeister
Basis-URL ist httpx: //domain.com: [Port] / Sie müssen App-Pfad selbst zu dieser Lösung hinzufügen
Pawel Cioch
9

Die beliebte GetLeftPartLösung wird in der PCL-Version von Urileider nicht unterstützt . GetComponentsWenn Sie jedoch Portabilität benötigen, sollte dies den Trick tun:

uri.GetComponents(
    UriComponents.SchemeAndServer | UriComponents.UserInfo, UriFormat.Unescaped);
Todd Menier
quelle
6

Ich glaube, dass die obigen Antworten nicht berücksichtigen, wenn sich die Website nicht im Stammverzeichnis der Website befindet.

Dies ist ein für WebApi-Controller:

string baseUrl = (Url.Request.RequestUri.GetComponents(
                    UriComponents.SchemeAndServer, UriFormat.Unescaped).TrimEnd('/') 
                 + HttpContext.Current.Request.ApplicationPath).TrimEnd('/') ;
Rufo
quelle
Verwenden Sie innerhalb eines Controllers Configuration.VirtualPathRoot, da es hostunabhängig ist.
Darrel Miller
5

Für mich sieht @ warlock's hier wie die beste Antwort aus, aber ich habe dies in der Vergangenheit immer verwendet.

string baseUrl = Request.Url.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.UriEscaped)   

Oder in einem WebAPI-Controller;

string baseUrl = Url.Request.RequestUri.GetComponents(
    UriComponents.SchemeAndServer, UriFormat.Unescaped)

Dies ist praktisch, damit Sie auswählen können, welches Escape-Format Sie möchten. Ich bin mir nicht sicher, warum es zwei so unterschiedliche Implementierungen gibt, und soweit ich das beurteilen kann, geben diese Methode und @ warlocks in diesem Fall genau das gleiche Ergebnis zurück, aber es sieht so aus, als GetLeftPart()würde dies beispielsweise auch für Nicht-Server-Uri-ähnliche mailtoTags funktionieren .

Cirrus
quelle
Gibt eine ungültige URL für Fälle zurück, in denen Sie sich hinter ngrok tunnel und https
Mohammad Zekrallah befinden.
5

Dies ist eine viel narrensicherere Methode.

VirtualPathUtility.ToAbsolute("~/");
Daniel A. White
quelle
@ Daniel Aufruf wird nicht einfach zurückgegeben, /wenn Sie in einer Anwendungsdomäne hosten,
vibs2006
@ Vibs2006 Ja, es ist eine mehrdeutige Frage
Daniel A. White
4

Ich gehe mit

HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Talha
quelle
1
Dadurch wird das Protokoll hinzugefügt: (HttpContext.Request.ServerVariables ["HTTPS"] == "off"? "HttpContext.Request.ServerVariables [" HTTP_HOST "]
onemorecupofcoffee
4

Basierend auf dem, was Warlock geschrieben hat, habe ich festgestellt, dass das virtuelle Pfadstammverzeichnis benötigt wird, wenn Sie nicht im Stammverzeichnis Ihres Webs gehostet werden. (Dies funktioniert für MVC Web API-Controller.)

String baseUrl = Request.RequestUri.GetLeftPart(UriPartial.Authority) 
+ Configuration.VirtualPathRoot;
SpazDude
quelle
1

Ich verwende folgenden Code von Application_Start

String baseUrl = Path.GetDirectoryName(HttpContext.Current.Request.Url.OriginalString);

Crispijn Lange
quelle
1

Das funktioniert bei mir.

Request.Url.OriginalString.Replace(Request.Url.PathAndQuery, "") + Request.ApplicationPath;
  • Request.Url.OriginalString : Gibt den vollständigen Pfad zurück, der dem Browser entspricht.
  • Request.Url.PathAndQuery : Geben Sie den (vollständigen Pfad) - (Domänennamen + PORT) zurück.
  • Request.ApplicationPath : Gibt "/" auf dem gehosteten Server und "Anwendungsname" auf der lokalen IIS-Bereitstellung zurück.

Wenn Sie also auf Ihren Domainnamen zugreifen möchten, sollten Sie den Anwendungsnamen angeben, wenn:

  1. IIS-Bereitstellung
  2. Wenn Ihre Anwendung in der Unterdomäne bereitgestellt wurde.

====================================

Für die dev.x.us/web

es gibt diesen starken Text zurück

FAHID
quelle
0

Bitte verwenden Sie den folgenden Code                           

string.Format("{0}://{1}", Request.url.Scheme, Request.url.Host);
Pranav Joseph
quelle
Bitte erläutern Sie Ihren Code, damit andere Benutzer seine Funktionalität verstehen können. Vielen Dank!
Ignacio Ara
-1
 string baseURL = HttpContext.Request.Url.Host;
shebin c babu
quelle
-2

Sie könnten möglicherweise den Port für Nicht-Port 80 / SSL hinzufügen?

etwas wie:

if (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != null && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "80" && HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString() != "443")
            {
                port = String.Concat(":", HttpContext.Current.Request.ServerVariables["SERVER_PORT"].ToString());
            }

und das im Endergebnis verwenden?

Mark Redman
quelle
6
Request.Url.Authoritywird die Portnummer enthalten, wenn es nicht Standard ist
Andomar