it-swarm.it

Qual è il metodo migliore in ASP.NET per ottenere il dominio corrente?

Mi chiedo quale sia il modo migliore per ottenere il dominio corrente in ASP.NET?

Per esempio:

http://www.domainname.com/subdir/ dovrebbe cedere http://www.domainname.comhttp: //www.sub.domainname .com/subdir / dovrebbe produrre http://sub.domainname.com

Come guida, dovrei essere in grado di aggiungere un URL come "/Folder/Content/filename.html" (ad esempio generato da Url.RouteUrl () in ASP.NET MVC) direttamente sull'URL e dovrebbe funzionare.

98
Matt Mitchell

Stessa risposta di MattMitchell ma con qualche modifica. Controlla invece la porta predefinita.

Modifica: sintassi aggiornata e utilizzo di Request.Url.Authority come suggerito

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

Secondo questo link un buon punto di partenza è:

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

Tuttavia, se il dominio è http://www.domainname.com:5 questo fallirà.

Qualcosa di simile al seguente è tentato di risolvere questo:

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.

Come tale, dovresti usare IsDefaultPort come nel risposta accettata sopra da Carlos Muñoz.

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

Questo è uno schema incluso.

28
izlence

ATTENZIONE! A chiunque utilizzi Current.Request . Url.Host. Comprendi che stai lavorando in base alla RICHIESTA ATTUALE 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 questo è qualcosa che ho scoperto non molto tempo fa. Il mio server tende a colpire http://proxyjudge1.proxyfire.net/fastenv di volta in volta. Application_BeginRequest () gestisce volentieri questa richiesta, quindi se chiami Request.Url.Host quando sta facendo questa richiesta ti verrà restituito proxyjudge1.proxyfire.net. Alcuni di voi potrebbero pensare "no duh" ma vale la pena notare perché è stato un bug molto difficile da notare poiché è accaduto solo lo 0,1% delle volte: P

Questo errore mi ha costretto a inserire il mio host di dominio come stringa nei file di configurazione.

19
Thirlan

Perché non usare

Request.Url.Authority

Restituisce l'intero dominio E la porta.

Hai ancora bisogno di capire http o https

13
Korayem

Semplice e breve way (supporta schema, dominio e porta):

sa 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

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"];
1
Derek Lawless

Un altro modo:


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

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();
0
Darren