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.
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}"
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.
Request.Url.GetLeftPart(UriPartial.Authority)
Dies ist im Schema enthalten.
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.
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
Einfach und Kurz (unterstützt Schema, Domain und Port):
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
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"];
Ein anderer Weg:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
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();