Qual è il metodo migliore in ASP.NET per ottenere il dominio corrente?
-
09-06-2019 - |
Domanda
Mi chiedo quale sia il modo migliore per ottenere il dominio corrente in ASP.NET?
Ad esempio:
http://www.nomedominio.com/sottodir/ dovrebbe cedere http://www.nomedominio.com http://www.sub.nomedominio.com/subdir/ dovrebbe cedere http://sub.nomedominio.com
Come guida, dovrei essere in grado di aggiungere un URL come "/Folder/Content/filename.html" (ad esempio come generato da Url.RouteUrl() in ASP.NET MVC) direttamente sull'URL e dovrebbe funzionare.
Soluzione
Stessa risposta di MattMitchell ma con qualche modifica.Questo controlla invece la porta predefinita.
Modificare:Sintassi e utilizzo aggiornati
Request.Url.Authority
come suggerito
$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
Altri suggerimenti
Come da questo link un buon punto di partenza è:
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
Tuttavia, se il dominio è http://www.nomedominio.com:500 questo fallirà.
Qualcosa di simile al seguente è tentato di risolvere questo problema:
int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host
+ (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");
Tuttavia, le porte 80 e 443 dipenderanno dalla configurazione.
In quanto tale, dovresti usare IsDefaultPort
come nel Risposta accettata sopra da Carlos Muñoz.
Request.Url.GetLeftPart(UriPartial.Authority)
Questo è lo schema incluso.
AVVERTIMENTO! A chiunque lo usi Richiesta.attuale.Url.Host.Comprendi che stai lavorando in base alla RICHIESTA CORRENTE e che la richiesta corrente non sarà SEMPRE con il tuo server e talvolta può essere con altri server.
Quindi, se lo usi in qualcosa come Application_BeginRequest() in Global.asax, il 99,9% delle volte andrà bene, ma lo 0,1% potresti ottenere qualcosa di diverso dal nome host del tuo server.
Un buon esempio di ciò è qualcosa che ho scoperto non molto tempo fa.Il mio server tende a bloccarsi http://proxyjudge1.proxyfire.net/fastenv di volta in volta.Application_BeginRequest() gestisce volentieri questa richiesta, quindi se chiami Request.Url.Host mentre effettua questa richiesta otterrai proxyjudge1.proxyfire.net.Alcuni di voi potrebbero pensare "no duh", ma vale la pena notare perché è stato un bug molto difficile da notare poiché si è verificato solo lo 0,1% delle volte:P
Questo bug mi ha costretto a inserire il mio host di dominio come stringa nei file di configurazione.
Perché non usarlo
Request.Url.Authority
Restituisce l'intero dominio E la porta.
Devi ancora capire http o https
Semplice E corto modo (supporta schema, dominio e porta):
Utilizzo 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
Un altro modo:
string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);
Che ne dite di:
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"];
Utilizzando 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();
Che ne dite di:
String domain = "http://" + Request.Url.Host