Was ist die beste Methode in ASP.NET die aktuelle Domain zu erhalten?
-
09-06-2019 - |
Frage
Ich frage mich, was der beste Weg, um die aktuelle Domäne ist in ASP.NET zu erhalten?
Zum Beispiel:
http://www.domainname.com/subdir/ sollte a href Ausbeute <=“ http://www.domainname.com“rel = "noreferrer"> http://www.domainname.com http://www.sub.domainname.com/subdir/ sollte a href Ausbeute <= "http://sub.domainname.com" rel = "noreferrer"> http://sub.domainname.com
Als Richtwert soll ich in der Lage sein, eine URL wie „/Folder/Content/filename.html“ hinzuzufügen (etwa wie die durch Url.RouteUrl () in ASP.NET MVC) direkt auf die URL und es sollte funktionieren .
Lösung
Die gleiche Antwort wie MattMitchell sind aber mit einigen Änderungen. Dieser prüft für den Standard-Port statt.
Edit: Aktualisiert Syntax und Verwendung von
Request.Url.Authority
wie vorgeschlagen
$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
Andere Tipps
Wie pro Link einen guten Ausgangspunkt ist :
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
Wenn jedoch die Domain http://www.domainname.com:500 dieses Willens scheitern.
So etwas wie die folgende ist verlockend, dies zu beheben:
int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
+ (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");
Allerdings Port 80 und 443 werden von der Konfiguration ab.
Als solches Sie IsDefaultPort
wie im akzeptierte Antwort oben von Carlos Muñoz verwenden sollten.
Request.Url.GetLeftPart(UriPartial.Authority)
Dies ist Schema enthalten.
ACHTUNG! Für jeden, der verwendet Current.Request .Url.Host. Verstehen Sie, dass Sie arbeiten, basierend auf der aktuellen Anforderung und dass die aktuelle Anforderung wird nicht immer mit dem Server und können manchmal mit anderen Servern sein.
Also, wenn Sie diese in etwas verwenden wie, Application_BeginRequest () in der Datei Global.asax, dann 99,9% der Zeit wird es in Ordnung sein, aber 0,1% könnten Sie etwas anderes als Ihre eigenen Server Hostnamen bekommen.
Ein gutes Beispiel dafür ist etwas, was ich nicht schon längst entdeckt. Mein Server neigt http://proxyjudge1.proxyfire.net/fastenv von Zeit zu Zeit zu treffen. Application_BeginRequest () Griffe gerne diese Anfrage, wenn Sie Request.Url.Host rufen, wenn es diese Anforderung, dass Sie zurück proxyjudge1.proxyfire.net bekommen. Einige von euch vielleicht denken „no duh“, aber erwähnenswert, weil es ein sehr harter Fehler war zu bemerken, da sie nur 0,1% der Zeit passiert: P
Dieser Fehler hat mich gezwungen, meine Domain-Host als String in den Konfigurationsdateien einzufügen.
Warum nicht verwenden
Request.Url.Authority
Es gibt die ganze Domäne und den Hafen.
Sie müssen noch auf Figur http oder https
Einfach und kurz Art und Weise (es Unterstützung Schema, Domäne und Port):
Verwenden 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
Eine andere Möglichkeit:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
Wie wäre:
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"];
Mit 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();
Wie wäre:
String domain = "http://" + Request.Url.Host